- 投稿日:2021-06-03T23:49:47+09:00
【Swift】APIから画像を取得して表示する
どういうことか APIを叩くとレスポンスでURLが返ってくる。 それを元に画像を表示したい。 今回はマジック・ザ・ギャザリングのAPIを使ってカード画像を表示しよう。 APIを叩く方法などは割愛。 Kingfisher 画像の変換にはライブラリのKingfisherを使う。 cocoaPodsでインストールする。 pod 'Kingfisher' 使い方はカンタン。 今回はcollectionViewに表示させることを想定している。 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CardCollectionViewCell.reusableIdentifier, for: indexPath) as! CardCollectionViewCell if let cardImage = cards?.cards[indexPath.row].imageUrl { cell.imageView.kf.setImage(with: URL(string: cardImage)) } return cell } ところがエラーが出て表示しない。 元の画像URLが https ではなく http であるため使うことができない。 httpが使えるようにする。 これで無事表示されました。 ちなみにこのカードは全カードを取得して1番上にあるカードで思い入れは特に無し。 好きなカードは走り回るスカージです。 おわり(´・ω・`)
- 投稿日:2021-06-03T23:49:33+09:00
[Swift]Dateの使用でいつもハマるので自分用に記事を書いてみた[SwiftUI]
今回作成したアプリ はじめに 今回はユニットテストについて学びたく勉強していたところ”Date使ってテスト書くといいよ”と言うアドバイスを頂いたので挑戦してみたらDateに関して結構勉強になったのでまとめてみました。 またUIKitとSwiftUIの両方で書いてみたのでUIKitはGitで公開し、この記事では主にSwiftUIで書いたものを掲載していきます。 環境 ・ macOS Big Sur 12 ・ Xcode : 12.5 Dateを使ってみる 今回は記録した日時と、現在の日時の差分によって表示するものを変えると言う実装をする為、とにかくDateを使用する所から始めた。 @State var dateText = "" var body: some View { VStack { Button(action: { let date = Date() dateText = "\(date)" }, label: { Text("Button") }) Text(dateText) } } 上記のコードはボタンを押すと現在の日時を取得して表示すると言うもの。 Formatterを使用して表示を定義する ただ表示するだけって基本的にあまり使用する事はないので基本”Date使うならFormatter”ぐらいの勢いで必要な気がする。 時間と分だけを表示させたい場合は以下の通り(Buttonのaction内以外は省略) let date = Date() let dateFormat = DateFormatter() dateFormat.dateFormat = "HH:mm" dateText = dateFormat.string(from: date) .dateFormatでは表示する日時の表現を定義できる。以下表にまとめた。 年 月 日 時間 分 秒 YYYY MM dd HH mm ss 2021 6 3 22 26 45 エリアの指定は.locale エリアの指定をしておかないと正確な時間が取れないのでこちらもデフォルトで書く。 dateFormat.locale = Locale(identifier: "jp_JP") エリアの指定を日本にした時は特に和暦に気を付ける これも最初わからなかった部分だが、iPhoneの設定で和暦を設定しているとYYYYの西暦表示の部分がめちゃくちゃな数字を返してくる時がある。 上記を防ぐには予め .timeStyleと.dateStyleを定義しておくとよい。 let dateFormat = DateFormatter() dateFormat.timeStyle = .full dateFormat.dateStyle = .full dateFormat.locale = Locale(identifier: "ja_jp") dateFormat.dateFormat = "YYYY/MM/dd HH:mm:ss" let date = Date() dateText = dateFormat.string(from: date) dateFormat.dateFormat = "YYYY/MM/dd HH:mm :ss"を削除すると以下のように表示される。 時間の差分を取得したい場合 timeIntervalSinceを使用すると差分が簡単に取れる。 @State var dateText = "" var body: some View { VStack { Button(action: { let dateFormat = DateFormatter() // 日時をString型で定義 let textLogDate = "2021-01-01 12:00:00" let textNowDate = "2021-01-01 12:01:20" // styleで和暦設定に対応 dateFormat.timeStyle = .full dateFormat.dateStyle = .full // dateFormatを初期設定した"2021-01-01 12:00:00"と同じ形式になるように定義 dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss" // localeを日本に dateFormat.locale = Locale(identifier: "ja_JP") // String型の日時をDate型に変換 let logDate = dateFormat.date(from: textLogDate) ?? Date() let nowDate = dateFormat.date(from: textNowDate) ?? Date() // timeIntervalSinceを使用すると差分を取得できる->nowDate-logDate let dateSubtraction: Int = Int(nowDate.timeIntervalSince(logDate)) dateText = "\(dateSubtraction)" }, label: { Text("Button") }) Text(dateText) } } なお、取得した差分は秒数の為、今回は80秒となる。 以上これからを使用して日時の差分を取得するアプリを作成してユニットテストを書いてみました。(こちらはUIKitで書きました) https://github.com/yuujioka/TimeCalculate まとめ 毎度毎度Dateの差分を取るときに演算しようとしたりして、アレ?ってなったり、Dateの形式指定するときにアレ?ってなったり、日時を指定したものをDate型にするときにアレ?となり、同じような鉄釘踏みまくっていたのでいい加減鉄ゲタ履こうと自分用に書きました! また日時取得はDateだけでなく、Calendarクラスを使用して取得、加工することも可能なので是非そちらもチャレンジしてみたいと思います!
- 投稿日:2021-06-03T23:49:33+09:00
[Swift]Dateの使用でいつもハマるので自分用に記事を書いてみた
今回作成したアプリ はじめに 今回はユニットテストについて学びたく勉強していたところ”Date使ってテスト書くといいよ”と言うアドバイスを頂いたので挑戦してみたらDateに関して結構勉強になったのでまとめてみました。 またUIKitとSwiftUIの両方で書いてみたのでUIKitはGitで公開し、この記事では主にSwiftUIで書いたものを掲載していきます。 環境 ・ macOS Big Sur 12 ・ Xcode : 12.5 Dateを使ってみる 今回は記録した日時と、現在の日時の差分によって表示するものを変えると言う実装をする為、とにかくDateを使用する所から始めた。 @State var dateText = "" var body: some View { VStack { Button(action: { let date = Date() dateText = "\(date)" }, label: { Text("Button") }) Text(dateText) } } 上記のコードはボタンを押すと現在の日時を取得して表示すると言うもの。 Formatterを使用して表示を定義する ただ表示するだけって基本的にあまり使用する事はないので基本”Date使うならFormatter”ぐらいの勢いで必要な気がする。 時間と分だけを表示させたい場合は以下の通り(Buttonのaction内以外は省略) let date = Date() let dateFormat = DateFormatter() dateFormat.dateFormat = "HH:mm" dateText = dateFormat.string(from: date) .dateFormatでは表示する日時の表現を定義できる。以下表にまとめた。 年 月 日 時間 分 秒 YYYY MM dd HH mm ss 2021 6 3 22 26 45 エリアの指定は.locale エリアの指定をしておかないと正確な時間が取れないのでこちらもデフォルトで書く。 dateFormat.locale = Locale(identifier: "jp_JP") エリアの指定を日本にした時は特に和暦に気を付ける これも最初わからなかった部分だが、iPhoneの設定で和暦を設定しているとYYYYの西暦表示の部分がめちゃくちゃな数字を返してくる時がある。 上記を防ぐには予め .timeStyleと.dateStyleを定義しておくとよい。 let dateFormat = DateFormatter() dateFormat.timeStyle = .full dateFormat.dateStyle = .full dateFormat.locale = Locale(identifier: "ja_jp") dateFormat.dateFormat = "YYYY/MM/dd HH:mm:ss" let date = Date() dateText = dateFormat.string(from: date) dateFormat.dateFormat = "YYYY/MM/dd HH:mm :ss"を削除すると以下のように表示される。 時間の差分を取得したい場合 timeIntervalSinceを使用すると差分が簡単に取れる。 @State var dateText = "" var body: some View { VStack { Button(action: { let dateFormat = DateFormatter() // 日時をString型で定義 let textLogDate = "2021-01-01 12:00:00" let textNowDate = "2021-01-01 12:01:20" // styleで和暦設定に対応 dateFormat.timeStyle = .full dateFormat.dateStyle = .full // dateFormatを初期設定した"2021-01-01 12:00:00"と同じ形式になるように定義 dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss" // localeを日本に dateFormat.locale = Locale(identifier: "ja_JP") // String型の日時をDate型に変換 let logDate = dateFormat.date(from: textLogDate) ?? Date() let nowDate = dateFormat.date(from: textNowDate) ?? Date() // timeIntervalSinceを使用すると差分を取得できる->nowDate-logDate let dateSubtraction: Int = Int(nowDate.timeIntervalSince(logDate)) dateText = "\(dateSubtraction)" }, label: { Text("Button") }) Text(dateText) } } なお、取得した差分は秒数の為、今回は80秒となる。 以上これからを使用して日時の差分を取得するアプリを作成してユニットテストを書いてみました。(こちらはUIKitで書きました) https://github.com/yuujioka/TimeCalculate まとめ 毎度毎度Dateの差分を取るときに演算しようとしたりして、アレ?ってなったり、Dateの形式指定するときにアレ?ってなったり、日時を指定したものをDate型にするときにアレ?となり、同じような鉄釘踏みまくっていたのでいい加減鉄ゲタ履こうと自分用に書きました! また日時取得はDateだけでなく、Calendarクラスを使用して取得、加工することも可能なので是非そちらもチャレンジしてみたいと思います!
- 投稿日:2021-06-03T23:49:33+09:00
[Swift]Dateの使用でいつもハマるので記事を書いてみた
今回作成したアプリ はじめに 今回はユニットテストについて学びたく勉強していたところ”Date使ってテスト書くといいよ”と言うアドバイスを頂いたので挑戦してみたらDateに関して結構勉強になったのでまとめてみました。 またUIKitとSwiftUIの両方で書いてみたのでUIKitはGitで公開し、この記事では主にSwiftUIで書いたものを掲載していきます。 環境 ・ macOS Big Sur 12 ・ Xcode : 12.5 Dateを使ってみる 今回は記録した日時と、現在の日時の差分によって表示するものを変えると言う実装をする為、とにかくDateを使用する所から始めた。 @State var dateText = "" var body: some View { VStack { Button(action: { let date = Date() dateText = "\(date)" }, label: { Text("Button") }) Text(dateText) } } 上記のコードはボタンを押すと現在の日時を取得して表示すると言うもの。 Formatterを使用して表示を定義する ただ表示するだけって基本的にあまり使用する事はないので基本”Date使うならFormatter”ぐらいの勢いで必要な気がする。 時間と分だけを表示させたい場合は以下の通り(Buttonのaction内以外は省略) let date = Date() let dateFormat = DateFormatter() dateFormat.dateFormat = "HH:mm" dateText = dateFormat.string(from: date) .dateFormatでは表示する日時の表現を定義できる。以下表にまとめた。 年 月 日 時間 分 秒 YYYY MM dd HH mm ss 2021 6 3 22 26 45 地域や言語に関してはLocaleを使用する dateFormat.locale = Locale(identifier: "jp_JP") Localeで使用するIDの一覧↓ 地域ごとの時間を取得する時はTimeZoneを使用する dateFormat.timeZone = TimeZone(identifier: "Asia/Tokyo") TimeZoneで使用するIDの一覧↓ 和暦に気を付ける これも最初わからなかった部分だが、iPhoneの設定で和暦を設定しているとYYYYの西暦表示の部分がめちゃくちゃな数字を返してくる時がある。 上記を防ぐには予め .timeStyleと.dateStyleを定義しておくとよい。 let dateFormat = DateFormatter() dateFormat.timeStyle = .full dateFormat.dateStyle = .full dateFormat.locale = Locale(identifier: "ja_jp") dateFormat.dateFormat = "YYYY/MM/dd HH:mm:ss" let date = Date() dateText = dateFormat.string(from: date) dateFormat.dateFormat = "YYYY/MM/dd HH:mm :ss"を削除すると以下のように表示される。 時間の差分を取得したい場合 timeIntervalSinceを使用すると差分が簡単に取れる。 @State var dateText = "" @State var timeZone = "" var body: some View { VStack { Button(action: { let dateFormat = DateFormatter() // 日時をString型で定義 let textLogDate = "2021-01-01 12:00:00" let textNowDate = "2021-01-01 12:01:20" // styleで和暦設定に対応 dateFormat.timeStyle = .full dateFormat.dateStyle = .full // dateFormatを初期設定した"2021-01-01 12:00:00"と同じ形式になるように定義 dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss" // localeを日本に dateFormat.locale = Locale(identifier: "ja_JP") // timeZoneを日本に dateFormat.timeZone = TimeZone(identifier: "Asia/Tokyo") // String型の日時をDate型に変換 timeZone = dateFormat.string(from: Date()) let logDate = dateFormat.date(from: textLogDate) ?? Date() let nowDate = dateFormat.date(from: textNowDate) ?? Date() // timeIntervalSinceを使用すると差分を取得できる->nowDate-logDate let dateSubtraction: Int = Int(nowDate.timeIntervalSince(logDate)) dateText = "\(dateSubtraction)" }, label: { Text("Button") }) Text(dateText) Text(timeZone) } } } 時間は日本時間を表示しており、取得した差分は秒数の差分となるので、今回は80秒と表示される。 以上これからを使用して日時の差分を取得するアプリを作成してユニットテストを書いてみました。(こちらはUIKitで書きました) https://github.com/yuujioka/TimeCalculate まとめ 毎度毎度Dateの差分を取るときに演算しようとしたりして、アレ?ってなったり、Dateの形式指定するときにアレ?ってなったり、日時を指定したものをDate型にするときにアレ?となり、同じような鉄釘踏みまくっていたのでいい加減鉄ゲタ履こうと戒めの意味も込めて書きました! また日時取得はDateだけでなく、Calendarクラスを使用して取得、加工することも可能なので是非そちらもチャレンジしてみたいと思います!
- 投稿日:2021-06-03T23:49:33+09:00
[Swift]日付を取得し差分を出す方法
今回作成したアプリ はじめに 今回はユニットテストについて学びたく勉強していたところ”Date使ってテスト書くといいよ”と言うアドバイスを頂いたので挑戦してみたらDateに関して結構勉強になったのでまとめてみました。 またUIKitとSwiftUIの両方で書いてみたのでUIKitはGitで公開し、この記事では主にSwiftUIで書いたものを掲載しています。 環境 ・ macOS Big Sur 12 ・ Xcode : 12.5 日付を取得する @State var dateText = "" var body: some View { VStack { Button(action: { let date = Date() dateText = "\(date)" }, label: { Text("Button") }) Text(dateText) } } ボタンを押すと現在の日時を取得して表示する。 Formatterを使用して表示を定義する ただ表示するだけって基本的にあまり使用する事はないので基本”Date使うならFormatter”ぐらいの勢いで必要な気がする。 時間と分だけを表示させたい場合は以下の通り(Buttonのaction内以外は省略) let date = Date() let dateFormat = DateFormatter() dateFormat.dateFormat = "HH:mm" dateText = dateFormat.string(from: date) .dateFormatでは表示する日時の表現を定義できる。以下表にまとめた。 年 月 日 時間 分 秒 YYYY MM dd HH mm ss 2021 6 3 22 26 45 地域や言語に関してはLocaleを使用する dateFormat.locale = Locale(identifier: "jp_JP") Localeで使用するIDの一覧↓ 地域ごとの時間を取得する時はTimeZoneを使用する dateFormat.timeZone = TimeZone(identifier: "Asia/Tokyo") TimeZoneで使用するIDの一覧↓ 和暦に気を付ける これも最初わからなかった部分だが、iPhoneの設定で和暦を設定しているとYYYYの西暦表示の部分がめちゃくちゃな数字を返してくる時がある。 上記を防ぐには予め .timeStyleと.dateStyleを定義しておくとよい。 let dateFormat = DateFormatter() dateFormat.timeStyle = .full dateFormat.dateStyle = .full dateFormat.locale = Locale(identifier: "ja_jp") let date = Date() dateText = dateFormat.string(from: date) Localをen_USに変えると表示が以下のように変わる dateFormat.dateFormat = "YYYY/MM/dd HH:mm :ss"をdateFormat.locale = Locale(identifier: "ja_jp")の下に追加すると以下の表示となる。 時間の差分を取得したい場合 timeIntervalSinceを使用すると差分が簡単に取れる。 @State var dateText = "" @State var timeZone = "" var body: some View { VStack { Button(action: { let dateFormat = DateFormatter() // 日時をString型で定義 let textLogDate = "2021-01-01 12:00:00" let textNowDate = "2021-01-01 12:01:20" // styleで和暦設定に対応 dateFormat.timeStyle = .full dateFormat.dateStyle = .full // dateFormatを初期設定した"2021-01-01 12:00:00"と同じ形式になるように定義 dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss" // localeを日本に dateFormat.locale = Locale(identifier: "ja_JP") // timeZoneを日本に dateFormat.timeZone = TimeZone(identifier: "Asia/Tokyo") // String型の日時をDate型に変換 timeZone = dateFormat.string(from: Date()) let logDate = dateFormat.date(from: textLogDate) ?? Date() let nowDate = dateFormat.date(from: textNowDate) ?? Date() // timeIntervalSinceを使用すると差分を取得できる->nowDate-logDate let dateSubtraction: Int = Int(nowDate.timeIntervalSince(logDate)) dateText = "\(dateSubtraction)" }, label: { Text("Button") }) Text(dateText) Text(timeZone) } } } 時間は日本時間を表示しており、取得した差分は秒数の差分となるので、今回は80秒と表示される。 以上これからを使用して日時の差分を取得するアプリを作成してユニットテストを書いてみました。(こちらはUIKitで書きました) https://github.com/yuujioka/TimeCalculate まとめ 自以上TimeZoneとLocaleの一覧やtimeIntervalSinceを使用して差分を取得する方法でした。
- 投稿日:2021-06-03T23:33:21+09:00
`Cannot find 'JSONEncoder' in scope` の対処
Cannot find 'JSONEncoder' in scopeというエラーの対処 あまりに初歩的ゆえに、なかなか見つからず困ったのでメモ。 環境 プログラム バージョン Xcode Version 12.5 swift Version 5.4 状況 Jsonのエンコード・デコードのやり方を調べるためにApple Developer Documentation に記載されている通り、以下のコードをプレイグラウンドで実行したところJSONEncoderのところでエラーが出た。 MyPlayground.playground struct GroceryProduct: Codable { var name: String var points: Int var description: String? } let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe pear.") let encoder = JSONEncoder() // エラー:Cannot find 'JSONEncoder' in scope encoder.outputFormatting = .prettyPrinted let data = try encoder.encode(pear) print(String(data: data, encoding: .utf8)!) 原因 フレームワークをインポートしていない。 対処 import Foundation を先頭に追加。 ちなみに、frameworkはApple Developer Documentationの右側にAvailabilityなどと一緒に記載されている。
- 投稿日:2021-06-03T18:09:17+09:00
【iOS】Metal Best Practicesの解説(1) 基本的な概念
何回か分けて、Metal Best Practicesを解説していきたいと思います。 (途中でやめたらごめんなさい。というか1回目で終わったらごめんなさい) Metal Best Practicesは、iOS/MacOS/tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。 本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきたいと思います。 読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。 Fundamental Concepts (基本的な概念) Metalを利用してグラフィックや計算をするのは、おそらく高いパフォーマンスを実現したいからだと思います。そして、効率的なMetalアプリでを作るためには次の点を考慮する必要があります。 CPUのオーバーヘッドが低いこと GPUパフォーマンスを最適化すること CPUとGPUの並列処理を最大化すること 効率的なリソース管理をすること これらを実現するためにはMetal APIを推奨した方法にしたがって使用する必要があります。 (短いですが1回目はここまでです。) 最後に iOSを使ったARやML、音声処理などの作品やサンプル、技術情報を発信しています。 作品ができたらTwitterで発信していきますのでフォローをお願いします? Twitterは作品や記事のリンクを貼っています。 https://twitter.com/jugemjugemjugem Qiitaは、iOS開発、とくにARや機械学習、グラフィックス処理、音声処理について発信しています。 https://qiita.com/TokyoYoshida Noteでは、連載記事を書いています。 https://note.com/tokyoyoshida Zennは機械学習が多めです。 https://zenn.dev/tokyoyoshida
- 投稿日:2021-06-03T00:58:28+09:00
クラスのInitを自動的に作成する
プログラミングをしていて以下のようなモデルクラスを作成した時、Initをいちいち書くのは大変です。 Xcodeが11.4以降の自動で生成することができます。 class Product { var id :String var name :String var arriveDay :Date } 手順としては 1:クラス名にカーソルを合わせる 2:右クリックでRefactorからGenerate Memberwise Initializerを選択することで自動生成されます。 ・ちなみにクラスだけではなく、構造体でも同じことができます。
- 投稿日:2021-06-03T00:00:26+09:00
swift filter関数、reduce関数、MinMax関数の使い方
fileter let numarray = [1,2,3,4,5] let newnumArray = numarray.filter { $0 < 3 } // 2までの値をフィルタリングする print(newnumArray) //出力結果 [1, 2] reduce let reduceArray = [1,2,3,4,5] var total = reduceArray.reduce(0) { (num1, num2) -> Int in return num1 + num2 } print(total) //出力結果 15 reduce もっと短く書く let reduceArray = [1,2,3,4,5] let total1 = reduceArray.reduce(0, +) // たしざん let total2 = reduceArray.reduce(1, *) // かけざん print(total1) //15 print(total2) //120 関数でMin、Maxを取得 let scores = [84, 76, 91, 62 ,80] let min = scores.min() let max = scores.max() print(min) // 62 print(max) // 91