tag:crieit.net,2005:https://crieit.net/tags/Swift/feed 「Swift」の記事 - Crieit Crieitでタグ「Swift」に投稿された最近の記事 2021-12-15T18:22:37+09:00 https://crieit.net/tags/Swift/feed tag:crieit.net,2005:PublicArticle/17856 2021-12-15T18:22:37+09:00 2021-12-15T18:22:37+09:00 https://crieit.net/posts/Swift-Cartography SwiftでCartographyを使う方法 <pre><code>//画面の横幅の長さを取得する変数を宣言 let width = UIScreen.main.bounds.size.width //banner画像 let banner_image:UIImage = UIImage(named:"logo")! let imageView = UIImageView(image:banner_image) self.view.addSubview(imageView) constrain(imageView, view) { banner_image, view in banner_image.top == banner_image.superview!.top + 120 banner_image.left == banner_image.superview!.left + 25 banner_image.width == width - 50 banner_image.height == (width - 50) / 2 } </code></pre> <p>参考URL</p> <p><a target="_blank" rel="nofollow noopener" href="https://wagtechblog.com/programing/swift-cartography.html">https://wagtechblog.com/programing/swift-cartography.html</a></p> wawa tag:crieit.net,2005:PublicArticle/17619 2021-08-27T23:19:06+09:00 2021-08-27T23:19:06+09:00 https://crieit.net/posts/AVAudioUnitSampler AVAudioUnitSamplerで指定したチャンネルの音をすべて止める方法 <p>AVAudioUnitSamplerにはチャンネル上でMIDIの音をならすためのstartNoteと、停止させるためのstopNoteメソッドがある。でも、例えば自動で演奏させていて、停止ボタンを押した時に全ての音を消したい、と思った時、全ての音を止めるためのメソッドがどうもないっぽい。</p> <p>ではどうするのか。</p> <p>AVAudioUnitSamplerにはsendMIDIEventという、MIDIイベントを直接送るできることのできる機能がある。それを利用することでチャンネルの音を全て停止することができた。</p> <p>具体的には下記のやり方でできた。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/16862 2021-04-19T23:32:28+09:00 2021-04-19T23:32:28+09:00 https://crieit.net/posts/AVMutableComposition-insertTimeRange AVMutableCompositionに音声をinsertTimeRangeして死ぬ時 <p>AVMutableCompositionで動画に音声をのせようと思ったときのこと。BGMの長さのほうが動画より短い場合にBGMをループさせようと思ったところ、どうも死んでしまったらしい。</p> <p>insertTimeRangeしている時はまだ死なず、合成のセッションが進んでいる時に死ぬので気づきづらい。いつのまにか <code>figAssetExportSession_CopyProperty signalled err=-16979</code> とか <code>figAssetExportSession_updateProgress</code> とかのエラーログが残っている。</p> <p>ためしにループの最後を削ってみたら成功したため、どうも最後のループの切り取り方がまずくはみだしているかなんかでエラーになっているような感じがした。</p> <p>下記参考URLを見ると、どうも同じ現象が発生していたようで下の方に修正すべき書き込みがあった。試してみたらうまく行った。</p> <p><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/20211694/loop-avmutablecompositiontrack">https://stackoverflow.com/questions/20211694/loop-avmutablecompositiontrack</a></p> <pre><code>audioDuration = CMTimeSubtract(totalDuration,videoDuration); to: audioDuration = CMTimeSubtract(videoDuration,currentTime); </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15130 2019-06-19T23:27:01+09:00 2019-06-19T23:30:43+09:00 https://crieit.net/posts/208f56095ca8e483481917ef0354ccf9 【禅Do】利用しているライブラリについて <h2 id="導入したライブラリについて"><a href="#%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">導入したライブラリについて</a></h2> <p>とりあえず当時、Carthageの情報が結構出ていて使いやすそうだったので<br /> 基本的にCarthageを利用してインストールする方針でやっていた。<br /> その中で対応していないものはCocoaPodsを利用するか、直接ソースを入れる形にした。</p> <h3 id="Carthageで入れたもの"><a href="#Carthage%E3%81%A7%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE">Carthageで入れたもの</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/malcommac/SwiftDate">SwiftDate</a> <ul> <li>リマインド機能の日付操作の為に導入</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/DeclarativeHub/Bond">Bond</a> <ul> <li>リアクティブプログラミング的なものを使ってみたかった為</li> <li>全体設計の見通しの良さ向上の為など</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/xmartlabs/Eureka">Eureka</a> <ul> <li>設定画面でリスト型テーブルやForm作成を簡単にするための導入</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/delba/Log">Log</a> <ul> <li>開発用途。デバッグのしやすさ向上の為</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/Quick/Quick">Quick</a> <ul> <li>開発用途。テストコードを書く為(なおちゃんとテストコード書いてない模様)</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/Quick/Nimble">Nimble</a> <ul> <li>開発用途。テストコードを書く為(なおちゃんとテストコード書いてない模様)</li> </ul></li> </ul> <h3 id="CocoaPodsで入れたもの"><a href="#CocoaPods%E3%81%A7%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE">CocoaPodsで入れたもの</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/firebase/firebase-ios-sdk">firebase-ios-sdk</a> <ul> <li>(今もかもだけど)当時モバイルのアナリティクスとしてイケてる感じだった為導入</li> <li>ユーザ動向を知るため</li> </ul></li> </ul> <h3 id="直接入れたもの"><a href="#%E7%9B%B4%E6%8E%A5%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE">直接入れたもの</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/thii/FontAwesome.swift">FontAwesome</a> <ul> <li>各種アイコンに利用</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/DylanVann/DatePickerCell">DatePickerCell</a> <ul> <li>設定画面でのCell操作の為に導入</li> </ul></li> </ul> <h2 id="導入ライブラリのアップデート"><a href="#%E5%B0%8E%E5%85%A5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88">導入ライブラリのアップデート</a></h2> <p>とりあえず当然ビルドが通らなくなってため、各ライブラリの最新版を利用するように<br /> Cartfileを書き換えてアップデートしてみた。<br /> ただそもそも、Carthageの使い方を忘れていたので、思い出すために下記記事などを参考にした。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/s-harada/items/47295d653ef0cf34d540">Carthage について</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.raywenderlich.com/416-carthage-tutorial-getting-started">Carthage Tutorial: Getting Started</a></p> <p>さらに元々、Carthageディレクトリ以下のBuild/Checkoutsもgit管理下においていたが、<br /> ライブラリアップデートを何回も試してる時に、いちいち削除が面倒になったのと<br /> 下記の記事を読んだので、git管理化から外すことにした。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mono0926/items/636819c42e96a8c4e12d">CocoaPods・Carthageでインストールした成果物はバージョン管理に含めるべきか?</a></p> <h3 id="アップデート方法"><a href="#%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E6%96%B9%E6%B3%95">アップデート方法</a></h3> <p>利用しているライブラリのうちほとんどは、Swift3へのアップデート対応等がされていたが<br /> Logライブラリだけはメンテが止まっていたので、forkして対応することにした。<br /> (代替のものを探したが方が良いが、とりあえずビルドを通すのが第一目標なのでそのまま利用)</p> <p>直接ソースを入れるタイプのものも、Carthage対応されるようになっていたので<br /> Carthageを利用してインストールする方式に変更した。</p> <p>メンテナンスされているライブラリはバージョン指定を外して<br /> 最新版をインストールするようにした。</p> <p>下記はSwiftのバージョンを3にして <code>carthage update --platform iOS</code> が<br /> 問題なく実行できるようになった時点でのCartfile。</p> <pre><code># Use libraries github "malcommac/SwiftDate" github "SwiftBond/Bond" github "xmartlabs/Eureka" github "Quick/Quick" github "Quick/Nimble" github "thii/FontAwesome.swift" github "DylanVann/DatePickerCell" ~> 1.0 # Own repos. github "stlwolf/Log" </code></pre> <h3 id="備考"><a href="#%E5%82%99%E8%80%83">備考</a></h3> <ul> <li>carthageでのインストールが成功するところまで行き、Xcode上でライブラリを<br /> 利用しているコードでErrorになってる箇所を修正することができる状態にはなった。</li> <li>Bondライブラリがアプリに入れた時期から大きな変更が入っているので、利用方法を含めて<br /> 再度使い方を調べないと最新版のコードを利用できそうにないことが判明。(ReactiveKitに組み込まれてる?)<br /> 公式Docと下記あたりを参考に別途キャッチアップする。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.raywenderlich.com/667-bond-tutorial-bindings-in-swift">Bond Tutorial: Bindings in Swift | raywenderlich.com</a><br /> <a target="_blank" rel="nofollow noopener" href="http://grandbig.github.io/blog/2017/07/31/swiftbond-1/">Bond, SwiftBondを使ってみよう! - Takahiro Octopress Blog</a></li> </ul> stlwolf tag:crieit.net,2005:PublicArticle/15085 2019-06-10T13:53:49+09:00 2019-06-19T23:31:31+09:00 https://crieit.net/posts/Swift2-3-Swift5 【禅Do】Swift2.3のアプリをSwift5対応にしたい <h2 id="大枠"><a href="#%E5%A4%A7%E6%9E%A0">大枠</a></h2> <p>数年前にSwiftの勉強のために作ったiOSアプリを、リリース後に全く<br /> アップデート対応していなかったので気がついたらSwiftのバージョンも5になってた。</p> <p>このアプリのWeb版出したりとか諸々やりたいことが出来てきているので<br /> とりあえず最新版のSwiftに対応して一度アプリを<br /> 更新リリースするところまでやることにした(頑張る)</p> <h2 id="前提条件"><a href="#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6">前提条件</a></h2> <ul> <li>1,2年ほどiOSアプリ周りを全く触ってなく以下は忘却されている <ul> <li>Swiftの文法、機能について</li> <li>Xcodeでの各種設定について</li> <li>リリースまでに必要なりソース、手順について</li> <li>導入したOSSライブラリについて</li> </ul></li> <li>アプリ自体の機能はかなり控えめなので、コード量自体は多くない</li> <li>当時リアクティブプログラミングの勉強を兼ねて<a target="_blank" rel="nofollow noopener" href="https://github.com/DeclarativeHub/Bond">Bond</a>というライブラリを利用している <ul> <li>RxSwiftとかを入れるほど大した機能はなかったので、機能が控えめなBondを入れた経緯</li> <li>ただ当時から大分実装が変わっているようなので、コレの置き換えが一番手間かかりそう</li> </ul></li> </ul> stlwolf tag:crieit.net,2005:PublicArticle/14580 2018-10-24T11:05:11+09:00 2018-10-31T10:45:15+09:00 https://crieit.net/posts/Swift-Static 手探りSwift: Staticメンバーをクラス内で呼ぶときにクラス名を書かなくちゃいけない <p>Swiftはstaticメンバーをクラス内で呼ぶときに、C#のようにメンバー名だけでは呼べなくて<code>className.memberName</code>のように書かなくてはいけない。これが馴染めない。タイプ数を問題にしているのではない。</p> <p>クラスの内側でクラス名が出てくると遠近が混乱して頭に余計な負荷がかかる。クラス名は外側の名前なのに、内側で出てくると他の内側の構成要素の語彙と馴染まない。固有名詞を出す必要のない場面で固有名詞が登場する。代名詞で十分である。</p> <p>あまりいいアイデアとも思えないけど、いい方法が見付かるまでの次善の策を思いついた。<br /> クラス名に外側の意味を持たない別名を付ける。下の例だと<code>Type</code>だけど、これは<code>Static</code>でも、<code>Class</code>でもなんでもいい。</p> <p>typealiasは実行時コストがゼロ(?)だから、純粋に表現の問題として扱える...はず。<br /> staticメンバーにアクセスするインスタンスメンバーを用意する方法もあると思う。そちらもコンパイル時の最適化によってコストゼロになりそうだけど、今の自分では判断ができなかったので避けた。</p> <h1 id="例"><a href="#%E4%BE%8B">例</a></h1> <p>こういう POSOがあったとして</p> <pre><code class="swift">struct Supercalifragilisticexpialidocious { var dateStr = "" } </code></pre> <h3 id="Before"><a href="#Before">Before</a></h3> <pre><code class="swift">import Foundation extension Supercalifragilisticexpialidocious { private static var df = ISO8601DateFormatter() var date: Date? { get { return Supercalifragilisticexpialidocious.df.date(from: dateStr) } set { dateStr = Supercalifragilisticexpialidocious.df.string(from: dateStr) } } } </code></pre> <p>DateFormatterのインスタスをstatic変数<code>df</code>にキャッシュしておく。プロパティ<code>date</code>では、<code>df</code>を使って文字列と日付を変換する。<code>df</code>はprivate変数であり内側の構成要素なのだけど、<code>Supercalifragilisticexpialidocious</code>と書かれていることで<code>df</code>が今のスコープの外側のモノという錯覚が生れる。</p> <h3 id="After"><a href="#After">After</a></h3> <pre><code class="swift">import Foundation extension Supercalifragilisticexpialidocious { fileprivate typealias `Type` = Supercalifragilisticexpialidocious private static var df = ISO8601DateFormatter() var date: Date? { get { return Type.df.date(from: dateStr) } set { dateStr = Type.df.string(from: dateStr) } } } </code></pre> <p>自クラスを<code>Type</code>という代名詞で指せるようになった。<br /> 言語の上に、自分ルールを置くことによってコードを読むときのスコープが狭まって読みやすくなったと思う。ただしルールは増えたし、そのルールは自分しか知らない。</p> あぜち(おばあちゃん)