20210914のSwiftに関する記事は6件です。

SwiftでWordPressの各記事のアイキャッチ画像URLを取得

WordPress REST APIについて WordPress REST APIでWordPressの記事情報をJSONで受け取る。 基本となるURLはこれ。 http://◯◯◯.◯◯/wp-json/wp/v2/posts ただこのURLだとWordPressの表示設定で設定した記事数分しか表示されないし上限は100記事。 このURLにパラメーターを付けることで、取得できる記事の数やアイキャッチ画像情報などをカスタマイズできる。 例えばこれ。 https://◯◯◯.◯◯/wp-json/wp/v2/posts?per_page=15&page=\1&_embed=1 これは1ページあたり15記事の情報があるJSONの1ページ目&アイキャッチ画像を追加という意味。 JSONを見やすくしたい時はこちらがおすすめ。 SwiftでWordPress REST APIのJSON情報を受け取る 使うライブラリは「Alamofire」と「SwiftyJSON」 ライブラリの導入については他の記事を御覧ください。 適当なファイルに以下の記事を書く。 func getArticles() { AF.request("https://◯◯◯.◯◯/wp-json/wp/v2/posts?per_page=15&page=\(self.count)&_embed=1").responseJSON { response in guard let data = response.data else { return } do { var articleinfo: [ArticleModel] = try JSONDecoder().decode([ArticleModel].self, from: data) if let jsonObject = response.value { let json = JSON(jsonObject) for i in 0..<json.count { let array = json[i] //記事のURL let link = array["link"].stringValue //アイキャッチ画像のURL var thumbnailURL = array["_embedded"]["wp:featuredmedia"][0]["media_details"]["sizes"]["medium"]["source_url"].stringValue //記事によって読み取れない場合があるので代替手段 if thumbnailURL == "" { thumbnailURL = array["_embedded"]["wp:featuredmedia"][0]["source_url"].stringValue } //取得したアイキャッチ画像URLをprint print(thumbnailURL) } } //ページング用変数の数字を増やす self.count += 1 } catch let error { print("ERROR: \(error)") } } } アイキャッチ画像のURLの場所は複雑なので見つけるのが割と大変。 *今回取得した画像はmediumで300×200の長方形画像。 *WordPressテーマによって異なる場合もある。 count変数をパラメーターに入れておくことでページングを繰り返し処理できる。 ここでは書いていないが、ページングが終了したときには繰り返し処理を終了させると良いかも。 画像のサイズの種類を変えたい人は以下のJSONを参考に。 "medium": { "file": "◯◯◯◯◯◯.jpeg", "width": 300, "height": 200, "mime_type": "image/jpeg", "source_url": "◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯.jpeg" }, "large": { "file": "◯◯◯◯◯◯.jpeg", "width": 1024, "height": 683, "mime_type": "image/jpeg", "source_url": "◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯.jpeg" }, "medium_large": { "file": "◯◯◯◯◯◯.jpeg", "width": 768, "height": 512, "mime_type": "image/jpeg", "source_url": "◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯.jpeg" }, "full": { "file": "◯◯◯◯◯◯.jpeg", "width": 1300, "height": 867, "mime_type": "image/jpeg", "source_url": "◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯.jpeg" } 正直iPhone対象ならfullほと大きなファイルは読み込みに時間がかかるだけで要らない気もします。 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者の時に疑問だったこと! guard let x = y else { return }編

今回の内容 学習を始めてまだ1ヶ月くらいの時によく理解出来なかったguard let x = y else { return }について、自分なりに解説していきます。 コードと簡単解説 * いきなりですがguard let x = y else { return }について、自分が学習する中で得た答えは、未計画なnilが引き起こすエラーを回避する為に使用しています。 例コード1 下記のコードの場合,変数yがnilで無い時にprint(x)を働かすことができます。 実際に下記のコードを動かすと、print(x)は働きません。 理由は、 変数yを宣言する時にString?で宣言をしています。 var y:String?の様に?を書いて宣言すると、値にはnilが入ってしまいます。 なのでprint(x)を働かすにはguard let x = y else { return }の処理より前に、変数yがnilでは無い状態にしないといけません。 var y:String? override func viewDidLoad() { super.viewDidLoad() guard let x = y else { return } print(x) } 例コード2 下記のコードの場合,変数yが宣言時にnilを値として持っています。 ですが、guard let x = y else { return }の処理の前で、"Not nil"を変数yに入れています。 よって変数yの値がnilでは無い状態になったのでprint(x)を働かすことができます。 var y:String? override func viewDidLoad() { super.viewDidLoad() y = "Not nil" guard let x = y else { return } print(x) } 終わり ご指摘、ご質問などありましたら、コメントまでお願い致します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Firebase ClashlyticsをSPMで導入する際に困ったこと

FirebaseのClashlyticsをSwift Package Managerを使って導入するときに詰まった点があったので備忘録 FirebaseApp.configure()をしておく (ここ)[https://firebase.google.com/docs/ios/setup?authuser=0#initialize-firebase]にあるように、pplication:didFinishLaunchingWithOptions:内でFirebaseApp.configure()を実行しFirebaseを初期化する必要あり(Cocoa PodsでもCarthageでも一緒ですが) RunScriptでスクリプトの記述 (ここ)[https://firebase.google.cn/docs/crashlytics/get-started?hl=ja&platform=ios#set-up-dsym-uploading]に書いてあるように、レポートを作成する際にプロジェクトのデバッグ シンボル(dSYM)ファイルが必要らしい。これはアプリをビルドする度にXcode側で生成し、dSYMファイルをアップロードする必要があるので、RunScriptに下記のコマンドを実行すると書いてあるが "${PODS_ROOT}/FirebaseCrashlytics/run" これはCocoa PodsでClashlyticsを導入した時のスクリプトなので、spmの際は下記のスクリプトを実行しなければいけない ${BUILD_DIR%Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run RunScriptのinputファイルには下記の二つを指定 ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME} $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH) 実際にクラッシュレポートを送るときはsimulatorとの接続を切る これで詰まったのだが、XcodeでRunを実行し、立ち上がったアプリだとクラッシュレポートが送れないらしい。なのでアプリを立ち上げた後にXcode側で□ボタンでアプリを停止する。そしてsimulator側でホームボタンを二回押し、該当アプリを上にスライドで消去し、もう一度アプリを一から立ち上げて使えばレポートが送信できるようになる。レポートの送信タイミングはクラッシュした後にXcodeで再びアプリをRunしたときであり、その際にログ画面にCompleted report submissionと表示されていれば送信できているということになる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift言語での値型と参照型

値型と参照型について、モヤモヤっとしていたので調べた時の覚書 Classは参照型 参照型は変数にインスタンスの値のメモリ保管場所を収納する。 なので、インスタンスが入った変数vを他の変数zに代入するとzにもインスタンスの値のメモリアドレスが格納される。つまりvとzは同じインスタンスのメモリアドレスを見てるので、どちらかが変更された場合はその片方の値も変更(されたように見える。vの値が変更されたわけではなく、vの参照しているメモリアドレスに格納されている値が変更されている)される。また、let表記でもプロパティの変更はできる(変数のメモリには参照先のアドレスがあるのみで、そのアドレスを変更しているわけではないから) class A { var test:Int = 0 } let v = A() v.test = 1 let z = v z.test = 2  // letだけど変更できる z = A() // NG! print(v.test) // 2 print(z.test) // 2 StructやEnumは値型 値型は変数に値そのものを収納する。 なので、変数vとzが見ている先は別のものなので両者はそれぞれ独立している なので、プロパティを変更するときは、let表記だと変更できない(変数のメモリに値があり、その値を変更しようとしているため) class A { var test:Int = 0 } let v = A() v.test = 1 let z = v z.test = 2 print(v.test) // 1 変更されていない print(z.test) // 2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DispatchQueue.main.asyncとDispatchQueue.main.syncの違い

題意 DispatchQueue.main.asyncにおいて、なぜメインスレッド指定なのに、非同期に実行させているのか不明だったので調査してみた。 結果 DispatchQueue.main.syncは呼び出し元のスレッドでの処理にキューとしてつみあげられる。バックグラウンドスレッドでDispatchQueue.main.syncを実行するとバックグラウンドスレッドのキューに積み上げられてしまうイメージ。下記のような実行順序になる。 DispatchQueue.global().async { // 一番目に実行 DispatchQueue.main.sync { // syncなので呼び出し元のスレッドでの処理が終了したときに呼ばれる // 二番目に実行 } // 三番目に実行 } しかしDisoatchQueue.main.asyncで呼ぶと呼び出し元のスレッドの処理と同時に非同期処理が行われるようになる。 DispatchQueue.global().async { // 一番目に実行 DispatchQueue.main.async { // asyncなので呼び出し元のスレッドでの処理と並行して処理がよばれる // 二番目に実行 } // 二番目に実行(ここでの処理はDispatchQueue.main.asyncの中の処理と同じタイミングで走る) } だから、asyncを呼ぶときはローディング画面の表示など、バックグラウンドでの処理と並行して呼びたいときに使われるらしい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】ボイスチェンジャーアプリでBluetoothイヤホンを使用して録音再生できるようにしてみた

「おばけだぞう」と子供がしつこく言うので、変声機アプリを作ってみた。 サンプル画像: アプリ概要: -「Record」ボタンで音声を録音 -スライダー「Speed」「Pitch」、スイッチ「Echo」「Reverb」で声のエフェクトをかける -「Play」ボタンで再生、モーダルに画面遷移してお化けアイコンの表示 参考サイト: [Swift4.2]蝶ネクタイ型変声期作ってみた 課題: 再生時に「音量」が上がらない。 Bluetoothイヤホンを接続すると「録音・再生」が機能しない。 下記のサイトを参考: AVAudioSessionで録音する際に、音はbluetoothイヤホン、マイクはデバイスマイクを使いたい 追加したコード。 Audio.swift try session.setCategory( .playAndRecord, mode: .default, // オプションの内容は[]で閉じると良い options: [.defaultToSpeaker, // マイク/レシーバーからマイク/スピーカーに変更 .allowAirPlay, // AirPlayデバイスにストリーミング .allowBluetoothA2DP]) // Bluetoothイヤホンで録音再生可能 githubにコード全文を載せています。 (https://github.com/r-tattsu2060/Voicechange/tree/main/Voicechange)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む