20210427のSwiftに関する記事は11件です。

【Swift】アラートを表示する方法

はじめに Swiftでダイアログを表示したかったため、実装方法をまとめました。 基本的なダイアログの表示 UIAlertControllerのインスタンスを作成してpresent関数に渡すことで、ダイアログを表示することができる。 また、OKボタンのようなアクションを追加したい場合は、UIAlertActionのインスタンスを作成し、addActionでアラートに追加する。 let alert = UIAlertController(title: "タイトル", message: "サブタイトル", preferredStyle: .alert) // アクションの追加 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in // アクションがタップされた時に実行される処理 NSLog("OKがタップされました。") })) self.present(alert, animated: true, completion: nil) TextFieldを追加する addTextFieldを使うことでダイアログにテキストフィールドを追加することができる。 (ただし、ダイアログにTextFieldを追加したい場合、preferredStyleプロパティをUIAlertController.Style.alertに設定する必要がある。) let alert = UIAlertController(title: "タイトル", message: "サブタイトル", preferredStyle: .alert) // TextFieldを追加 alert.addTextField { (textField) in // TextFieldの設定をする。 textField.placeholder = "テキストを入力してください。" } // アクションの追加 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in // アクションがタップされた時に実行される処理 NSLog("OKがタップされました。") })) self.present(alert, animated: true, completion: nil)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クロージャと簡略引数名

定義するクロージャの型が推論できるケースでは、型を省略することができます。 var closure: (String) -> Int // 型を明記 closure = { (string: String) -> Int in return string.count } closure("abc") // 3 // 型を省略 closure = { string in return string.count } closure("def") // 3 一番最初にclosureの型が定義されるので、Swiftが勝手に型を推測してくれます。 簡略引数名 さらに引数名の定義を省略し、代わりに簡略引数名を利用できます。 簡略引数名は、ドルマークに引数のインデックスをつけた$0などがそれです。 let isEqual: (Int, Int) -> Bool = { return $0 == $1 } isEqual(1, 1) // true 簡略引数名を使用したクロージャは、型推論ができない場合はエラーになります。 let notIsEqual = { return $0 == $1 } isEqual(1, 1) Ambiguous use of operator '==' まとめ 無闇矢鱈に使用すると可読性は低くなりますが、シンプルな処理であれば積極的に利用した方が良さそうです。 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ) 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift5 UITextViewのtextContainerInsetについて

TextView内の文字周りにマージンを入れる方法がわからなかったので、解決方法を記録したいと思いました。 textContainerInset を使う qiita.rb TextView.textContainerInset = .init(top: 16, left: 16, bottom: 16, right: 16) このように、引数の数値を変えてあげれば解決できました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クロージャ

クロージャ クロージャは、処理をまとめて呼び出し可能にします。処理を即席的に定義して他の処理に渡すことができます。書き方はこんな感じ。 { 引数 in 戻り値を返す値 } 引数には入力される値、戻り値には出力される値を入れます。 例として、mapメソッドに各要素を2倍にするクロージャ式を渡す処理が下記となります。 let num = [1, 2, 3] let doubleNum = num.map({ value in value * 2 }) print(doubleNum) // [2, 4, 6] まとめ クロージャは関数の一種ですが、名前も要らず、型推論により型の記述が省略可能だったりと、関数よりも軽量化して定義することができるメリットがあります。 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

暗黙のリターン

var userName = "Watanabe" func makeMassage(user: String) -> String { "Hello, \(user)" } makeMassage(user: userName) 上のサンプルコードは、戻り値がある関数なのに、returnをつけていません。 関数内の実装が戻り値の返却のみの時だけ、暗黙的なreturnができます。 func nonMakeMassage(user: inout String) -> String { user = "Tanaka" "Hello, \(user)" } nonMakeMassage(user: &userName) 当たり前ですが上のコードだと Missing return in a function expected to return 'String'; did you mean to return the last expression? と怒られました。 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ) 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

可変長引数

可変長引数とは 引数の個数を自由に設定出来るパラメーター 書き方 型名の後ろに ... を記述します。 func print(strings: String...) { if strings.count == 0 { return } print("first: \(strings[0])") for string in strings { print("elements: \(string)") } } print(strings: "apple", "banana", "orange") // 出力結果 first: apple elements: apple elements: banana elements: orange 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ) 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

inout引数

関数内での引数への再代入を関数外へ反映させたいとき、インアウト引数を使用します。 var userName = "" func getUserName(user: inout String) { if user.isEmpty { user = "Watanabe" } print(user) } getUserName(user: &userName) インアウト引数を使用するには、引数の型の前にinoutキーワードを追加します。 インアウト引数を持つ関数を呼び出す時は、引数の先頭に&をつけます。 ちなみに、普通にinoutをつけずに書いてみると、 var userName = "" func getUserName(user: String) { if user.isEmpty { user = "Watanabe" } print(user) } getUserName(user: &userName) 関数内の条件分岐の中で下記のエラーが出てきます。 Cannot assign to value: 'user' is a 'let' constant 関数内でuserを新たに定義しなければいけないと怒られました。 なぜか? 二番目のプログラムで行っているのは値渡しですが、最初に書いたinout引数を使用したプログラムは参照渡しを行っています。 参照渡しとは、変数のアドレスを引き渡すことです。 参照渡しは値ではなくアドレスを渡すので、変数そのものの値が書き換えられ、さらに元の値も失われます。よって値を変更することに成功しました。 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)  https://qiita.com/Hic2770/items/9214487fe031846c286d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

外部引数名の省略

外部引数名を省略したい場合は、外部引数名にアンダースコアをつけることで省略できます。 func sum(_ x: Int, _ y: Int) { return x + y } sum(1, 3) //出力: 4 省略しない通常の書き方だと sum(x: 1, y: 3) と書く必要があるので、省略できた方がコードがシンプルになりますね。 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

命名規則

単語の区切り方 Swiftではキャメルケースを使用します。 変数、定数: ローワーキャメルケースを使用。(camelCase, someVariable, someContentsのように最初の単語の頭が小文字で、それ以降の単語は頭文字を大文字にする) 型: キャメルケースを使用。(CamelCase, SomeVariable, SomeContentsのように最初の単語の頭文字から単語ごとに頭文字を大文字にする) 単語の選び方 ・必要な単語は全て含める 悪い例: findUser(_:)関数は、どのようにユーザーを検索するのか曖昧 良い例: findUser(byID:)関数は、ユーザーIDで検索することがわかりやすい ・一般的でない単語の使用は避ける 悪い例:epidermisは「表皮」という意味だが、あまり一般的な単語ではない 良い例:skinは一般的かつ、epidermisと同様の意味の単語なので良い ・略語を避ける 悪い例:stmtはstatementの略語だがわかりにくい 良い例:statementのように単語は略さずそのまま使用する まとめ 気にしなくても一応プログラムは動きますが、現場で開発する際は基本ルールに合わせて開発した方が他の人が見てもわかりやすいです。 また、キャメルケースかスネークケースかは、言語によって違うので、自分の使用する言語がどちらなのかを知っておく必要がありそうです。 参考 [増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【アプリ開発】最初に知っておくべき10のこと

はじめに 本記事では、未経験者が効率的にプログラミングの基礎を身に付けるためのコツを紹介していきます。プログラミングを初めて学習する方は是非一読してみてください。 対象読者:Xcodeを用いたアプリ開発に初めて挑戦する人 目次 1. 絶対にやるべきこと 【レベル:★☆☆】   1-1. アウトプットをたくさんする   1-2. 暗記の必要はない   1-3. 完璧な理解に拘らない   1-4. 質問をためらわない   1-5. たくさん考える 2. できるだけやるべきこと 【レベル:★★☆】   2-1. とにかくググる   2-2. Xcodeの補完機能を使う   2-3. こまめにチェックする 3. 慣れてきたらやるべきこと 【レベル:★★★】   3-1. ショートカットを使いこなす   3-2. 命名規則を意識する 第一章 絶対にやるべきこと 1-1. アウトプットをたくさんする 学習において、インプットとアウトプットの比率は「3:7」と言われています! (↑詳しくはアウトプット大全をご覧ください!) もちろん、プログラミング学習においても「アウトプット」は必ず必要です! また、「実際にやってみるアウトプット」と「誰かに説明してみるアウトプット」の二種類があります。 「実際にやってみる」 実際にボールを蹴らないでサッカー選手になれる人はいませんよね。アプリ開発も同様に、教材を見るだけではなく、「必ず」一緒に手を動かして自身のXcode上でアプリを作成しましょう。実際に手元で開発する中で、理解が深まり、エラー解決能力も養われるので一石二鳥です! 「誰かに説明してみる」 アウトプットの中でも、「他の人に教える」という行動が最も学習定着率が良いと言われています。 そのため、教材を進めていく時は、内容に対する自分の解釈を近くの人に説明してみましょう!一人の時は、自分に対して教えることも効果があると言われているので、積極的に行ってみてください。 もし、説明がうまくできない箇所があれば、まだ理解が及んでいない部分ということなので、復習したり質問したりして解消しましょう! 1-2. 暗記の必要はない 映画に出てくるプログラマーは、物凄いタイピング速度で何も見ずに書いていますが、現実とは大きく異なります。 実際は、コードを書く時間よりも「コードを調べている時間の方が長い」です! というのも、プログラミングは学校のテストなどと違って、いくらでもカンニングし放題です! そのため、暗記する必要はなく、忘れたらその都度ググりましょう! 1-3. 完璧な理解に拘らない 教材の中には、どうしても完璧な理解をするのが難しい部分があります。 もちろん隅々まで理解しようとすることはとても良いことですが、3ヶ月という限られた時間を考えると、時には「そういうものだ」と割り切ってしまうことも必要です。 一度理解を諦めたからと言って、ずっと分からないままになってしまうわけではありません。 最初は点の理解でも、学習を進めていくうちに点と点を繋げて、線の理解へと変化させていくイメージを持ちましょう! 1-4. 質問をためらわない プログラミングには知らないと絶対に分からない初見殺しが存在します。 初心者が何時間も詰まるエラーだとしても、経験者が見れば一瞬で解決できるかもしれません。一度自分で考えて分からなければ、周りの人に質問して前に進む勇気を持ちましょう! また、質問は「エラー解決の手段」というだけではなく、「自分の理解を深める手段」でもあります。エラーが発生していなくても、「自分の考えるコードの意味は正しいのか」「このコードがなくても問題ないのではないか」「こう書いても同じではないのか」などを確認する目的でも積極的に質問をしてみましょう! 1-5. たくさん考える 学習に悪い意味で慣れてくると、特に考えずに教材の内容を写経することができるようになってしまいます。少し時間は掛かっても、「このコードはどんな意味なのか」「なぜこの場所に必要なのか」など、しっかり考えながら学習しましょう! また、理解が怪しい部分はほったらかしにせず、質問等ですぐに解決することを心がけてください。 もし、どこまでいけば理解したと言って良いか分からない場合は、「イメージ同定」「具体例同定」の2点を確認してみましょう! これは、リーディングスキルテスト(参考)にも導入されている考え方で、「コードの流れを図などでイメージできるか」と「どんな具体例が当てはまるのか」の2点が分かっていれば、しっかり理解できていると言えます。 第二章 できるだけやるべきこと 2-1. とにかくググる 教材を使って学習する中で、気になったら小さなことでもググることを意識しましょう! 「プログラミング力 = ググる力」とも言われるくらい、ググることは大切なことなので、早いうちから習慣付けできるととても良いです。膨大な情報の中から必要なものを取捨選択する力を身に付けると、オリジナルアプリ開発の時に問題解決能力として活きてきます! 2-2. Xcodeの補完機能を使う プログラミングにおける一番多いエラーはタイピングミスです。どんなに優れた人間でも間違いは必ずあるので、なるべく機械の力に頼りましょう! Xcodeでは、書きたいコードの一部分を入力するだけで勝手に補完してくれるので、楽できる上にミスも減らせます。 また、補完が出てこないことで隠れたエラーに気づくことも多々あるので、良いことばかりです! 2-3. こまめにチェックする 全部の機能を実装してからプログラムを実行すると、エラーが出た時に原因の場所が特定しにくくなる可能性があります。最低でも、一機能を付け終わったら一度実行して、正しく動くか確認しましょう! 第三章 慣れてきたらやるべきこと 3-1. ショートカットを使いこなす 始めのうちは、ショートカットを使わない方が簡単で速いですが、ある程度使いこなせると効率が圧倒的に向上し、ライバルと進捗の差をつけることができます! また、プログラミング以外でも活用できるものも多いので、怖がらず積極的に使ってみましょう! と言っても、ショートカットはかなり多いので、ひとまず下の7個だけ覚えてしまいましょう! 超便利なショートカットキー7選 コマンド ショートカットキー コピー command + C ペースト command + V コメントアウト command + / ⭐️元に戻す⭐️ command + Z 「元に戻す」を元に戻す command + shift + Z 実行する command + R 文字列を検索する command + F 特に、command + Z は「消しちゃいけない所を消してしまった時の救世主」なので、是非活用してください! 興味がある人は他のショートカットも使ってみましょう! ・ショートカットキー(発展編その1) ・ショートカットキー(発展編その2) 3-2. 命名規則を意識する プログラミングでは、パーツのようなものに自分で名前を付けることが多々あり、自由になんでも名付けることができます。しかし、一般的にプログラマーの世界では、命名規則と呼ばれる名付ける時の暗黙のルールが存在します。これにより、他の人にとっての読みやすさ(可読性)が上がり、質問した時などメンターにコードの意図が伝わりやすくなるので、慣れてきたら命名規則も意識してコードを書けると完璧です! まずは、変数名や関数名に対して、意図に近い簡単な英単語を名付けてみましょう! ex) image1 → profileImage など 詳しくはこちら↓ 参考文献 https://qiita.com/koki_73/items/6e5334dc619d6c4f7754 https://career-ed-lab.mynavi.jp/career-column/707/ https://qiita.com/takahashikaito94/items/4c6a8d920fb5275eabaa https://pro-web-engineer.com/anki-317 https://qiita.com/narimiya/items/6a206c5b1c34a83182fb https://hiromiick.com/xcode-shortcut/ https://qiita.com/DaremachiYanagimachi/items/dcfcc5f51918a5e9a852 https://naoya-ono.com/swift/swift-basic/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

お天気APIを叩こう!(Swift・OpenWeatherMap)

はじめに 今回は、SwiftでOpenWeatherMapというAPIを叩いて指定した緯度経度の天気情報を取得し、天気情報を表示させようと思います。 この記事を読むことで操作を理解し、APIに関する理解を深められたら幸いです。 用いるAPIの紹介 今回使うAPIは、OpenWeatherMapという無料で世界中の天気予報などの情報を提供してくれる物を使います。 ※一部課金が必要な機能もあります。 完成予想図 今回は、サンプルとしてOpenWeatherMapを用いて取得した天気情報を表示させます。 初めてOpenWeatherMapを利用する場合 API Keyの取得にはアカウントの作成が必要です。 まだアカウントを作成していない方は、こちらの記事を参考にしてアカウントを作成し、自身のAPIキーを取得してください。 無料天気予報APIのOpenWeatherMapを使ってみる APIのやりとりの仕組み さらっとAPIのやり取りについての仕組みを説明します。 APIの定義はないですが、HTTPプロトコルを用いてネットワーク越しに呼び出すアプリケーション間、システム間のインターフェースのことを指すことが多いです。(下図参照) 特に、欲しいデータを取得するレスポンスと呼ばれるものは主にJSON型で返ってきます。 このJSON型で返ってきたデータから欲しい情報を抜き出して表示させたりすることができます。 今回はさらっとですが詳しく知りたい方はWeb APIとは何なのかを読んでみてください! JSONを見てみよう では、レスポンスのJSON形式で表示されるデータを見てみましょう! その前に、まずはリクエスト用のクエリを発行する必要があります。 pro.openweathermap.org/data/2.5/forecast/hourly?lat={lat}&lon={lon}&appid={API key} このURLのappid=というところに、自分のAPI Keyを入力し、lat=とlon=のところに天気の情報が欲しい地区の緯度経度を入力します。 そしてクエリの入力をしたURLをブラウザなどに入れてみると、以下のように現在の天気の情報が表示されると思います。 あれ?なんか思ってたのと違いますね汗 ごちゃごちゃしててよくわからないですが実はこれちゃんと取得できています。 これを綺麗にして可視化できるようにGoogle ChromeのJSON View Awesomeという拡張機能を使ってみようと思います! するとこんな感じに綺麗に表示させることができました! さらに整理してみると、、? 39個の天気データがあることがわかりました!! これでJSON型のデータを見ることができました。 今回使うライブラリの紹介 SwiftでAPIを利用しようとすると操作の意図がわかりにくい複雑なコードが多く、とても大変です。 そこで今回は2つのライブラリを用いることでコードをできるだけシンプルにわかりやすく書いていこうと思います。 今回用いるライブラリは、 SwiftyJSON 少ない記述量で JSONデータを取得でき、また直感的にJSON内 の欲しい値をゲットすることができるライブラリ Alamofire ネットワーク通信(http~)をシンプルに記述することができるライブラリ の二つになります。 cocoapodsでインストールしましょう。 実際にコードを書いてみよう!! ①リクエスト(http~)を発行しよう!! まず最初に、データを取得するためのリクエストURLを作ります。 let text = "https://api.openweathermap.org/data/2.5/weather?lat=\(latitude)&lon=\(longitude)&units=metric&appid=自分の発行したAPIKey" https://api.openweathermap.org/data/2.5/weather? ・・・発行元が決めてるから変えられない ?lat=\(latitude)&lon=\(longitude)&units=metric ・・・今回は緯度経度をパラメーターとする 今回は、蔵王温泉スキー場の天気を取得しようと思うのでlatitude=38.1705275、longitude=140.417219とします。 このtextは、ただのString型であるのでリクエストとして使える型に変換する必要があります。 そこで、 let url = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) と書くことで、先ほど定義したtextが新たにurlとしてリクエストに使える型に再定義されました。 ②APIコール処理 ①で作成したurlを使って実際にAPIのコール処理を実装します。 ここで、先ほどインポートしたライブラリであるAlamofireを用います。 AF.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default).responseJSON { (response) in switch response.result { case .success: case .failure(let error): } } Alamofireを用いることでAPIコール処理を簡潔に実装できます。 標準と比較した記事はこちら ③レスポンス後の処理 まずコードを提示します。 switch response.result { case .success: let json = JSON(response.data as Any) self.descriptionWeather = json["weather"][0]["main"].string! self.max.text = "\(Int(json["main"]["temp_max"].number!).description)℃" self.min.text = "\(Int(json["main"]["temp_min"].number!).description)℃" self.taikan.text = "\(Int(json["main"]["temp"].number!).description)℃" self.wind.text = "\(Int(json["wind"]["speed"].number!).description)m/s" case .failure(let error): print(error) } まず、天気情報結果を代入している値response.dataをJSONとしてjsonを作成します。 次に解析を行います。 ここで、インポートしたもう一つのライブラリであるSwiftyJSONが役立ちます。 天気だけの情報が欲しい時はjson["weather"][0]["main"].string!のように指定することで値を取得でします。ほんとシンプルでかわかりやすいですよね? こんな感じでマトリョーシカみたいなイメージで欲しいデータだけを引っ張れます。(この画像は別のプロダクトで撮った写真ですが、、) ④表示させる あとは、抽出したデータを煮るなり焼くなりするだけなんでサンプルコードを提示して終わりにしますね!! import UIKit import Alamofire import SwiftyJSON import KRProgressHUD class WeatherViewController: UIViewController, UISearchBarDelegate { @IBOutlet var tenkiImageView: UIImageView! @IBOutlet var max: UILabel! @IBOutlet var min: UILabel! @IBOutlet var taikan: UILabel! @IBOutlet var humidity: UILabel! @IBOutlet var wind: UILabel! @IBOutlet var backImageView : UIImageView! var descriptionWeather: String? var cityData : [String] = [] var selectedCity : String! var longitude : Double! var latitude : Double! override func viewDidLoad() { super.viewDidLoad() self.view.addBackground(name: "snow-mountain.jpg") backImageView.layer.cornerRadius = backImageView.frame.size.width * 0.1 backImageView.clipsToBounds = true tenkiImageView.layer.cornerRadius = tenkiImageView.frame.size.width * 0.1 tenkiImageView.clipsToBounds = true yoho() } func yoho() { let latitude = String(self.latitude) let longitude = String(self.longitude) let text = "https://api.openweathermap.org/data/2.5/weather?lat=\(latitude)&lon=\(longitude)&units=metric&appid=55b317379a06a94f5198e9c297ff0b0e" let url = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) AF.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default).responseJSON { (response) in switch response.result { case .success: let json = JSON(response.data as Any) self.descriptionWeather = json["weather"][0]["main"].string! if self.descriptionWeather == "Clouds" { self.tenkiImageView.image = UIImage(named: "kumori") }else if self.descriptionWeather == "Rain" { self.tenkiImageView.image = UIImage(named: "ame") }else if self.descriptionWeather == "Snow"{ self.tenkiImageView.image = UIImage(named: "yuki.gif") }else { self.tenkiImageView.image = UIImage(named: "hare") } self.max.text = "\(Int(json["main"]["temp_max"].number!).description)℃" self.min.text = "\(Int(json["main"]["temp_min"].number!).description)℃" self.taikan.text = "\(Int(json["main"]["temp"].number!).description)℃" self.wind.text = "\(Int(json["wind"]["speed"].number!).description)m/s" case .failure(let error): print(error) } } } } 終わりに 以上で終わりとなります。 もしかしたら間違いなどがあるかもしれないのであったらご指摘ください。 今回の記事を作成するにあたって SwiftでAPIを使う! 自分がつまずいたところを詳しく調べてみた を参考にさせて頂きました。是非こちらもご覧ください。 是非みなさんもお天気表示してみてくださいね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む