<?xml version="1.0" encoding="utf-8" ?><rss version="2.0">
<channel>
<title>iOS 開発入門</title>
<link>https://softmoco.com/</link>
<language>ja</language>
<item><title>Push Notification（プッシュ通知）を実装する方法 (Swift) - JWT トークン方式</title><link>https://softmoco.com/basics/ios-push-notifications-jwt.php</link><description>iOS アプリに Push Notification（プッシュ通知）を送る際の APNs (Apple Push Notification service) への認証方式には、証明書方式と、トークン方式のがあります。 &lt;br&gt;&lt;br&gt;以前「 Push Notification（プッシュ通知）を実装する方法 」で証明書方式を使った方法をご説明しました。&lt;br&gt;&lt;br&gt;証明書方式もまだ使えますが、現在はトークン方式が Apple で推奨されているので、ここではトークン方式の実装方法をご説明します。&lt;br&gt;&lt;br&gt;変更になるのは以下の 3 番と 5 番で、その他は同じ手順なので、前回の記事へのリンクしておきます。&lt;br&gt;&lt;br&gt; iOS アプリで Push Notification（プッシュ通知）を実装するには、有料の  Apple Developer Program に登録する必要があります。詳しくは「Apple Developer Program について」をご覧ください。&lt;br&gt;&lt;br&gt;それでは、JWT トークンの認証方式 を使って、Push Notification（プッシュ通知）を実装する方法を順を追ってご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;iOS アプリで Push Notification（プッシュ通知）について&lt;br&gt;Push Notification（プッシュ通知）の App ID を生成する方法&lt;br&gt;Xcode で Bundle Identifier を設定する&lt;br&gt;Apple Developer で iOS アプリの App ID を生成する&lt;br&gt;Apple Push Notification service 用の Key を生成する&lt;br&gt;Push Notification（プッシュ通知）を受信する iOS アプリを作る&lt;br&gt;Xcode で Push Notifications の Capability を追加する&lt;br&gt;iOS アプリで Push Notification を受信する方法&lt;br&gt;iOS アプリを iPhone にインストールして通知を許可し、デバイストークンを取得する&lt;br&gt;Node.js を使って Push Notification（プッシュ通知）を送信する</description><pubDate>Fri, 04 Jul 2025 17:34:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - Table View Cell にチェックボックスを追加する方法</title><link>https://softmoco.com/basics/swift-how-to-add-checkbox-to-table-view.php</link><description>Swift - Table View Cell にチェックボックスを追加する方法&lt;br&gt;&lt;br&gt;「Swift でチェックボックスを作る方法」では、Swift で View Controller にチェックボックスを追加する方法をご説明しました。&lt;br&gt;&lt;br&gt;ここでは、Table View の Table View Cell にチェックボックスを追加して使う方法をご説明します。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Table View を使う準備をする&lt;br&gt;表示する Item データを準備する&lt;br&gt;Item 構造体を作る&lt;br&gt;Item の Array データを作っておく&lt;br&gt;チェックボックスを使う準備をする&lt;br&gt;Table View Cell にチェックボックスを追加する方法&lt;br&gt;ItemTableViewCell クラスを作る&lt;br&gt;Table View Cell のクラスを設定する&lt;br&gt;Table View Cell にオブジェクトを配置する&lt;br&gt;Table View Cell のアウトレットを生成する&lt;br&gt;Table View でチェックボックスのデータを表示・更新する&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;Table View を使う準備をする&lt;br&gt;まずは Table View と Table View Cell を使う準備をします。&lt;br&gt;&lt;br&gt;手順は 「 Table View の使い方 」 と全く同じですので、やった方はそのプロジェクトを開いて、そのまま次に進んでください。&lt;br&gt;&lt;br&gt;「 Table View の使い方 」 をやっていない方は、Table View の使い方 の 3-1 から 3-4 を参考に Table View と Table View Cell を使う準備をしておいてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;表示する Item データを準備する&lt;br&gt;今回は Item という構造体を定義してデータを保存しておき、それを Table View Cell に表示します。&lt;br&gt;&lt;br&gt;ひとつのセルに表示したい Item の情報は、選択状態（チェックボックス）、商品の名前、色の三つです。&lt;br&gt;&lt;br&gt;itemID, itemName, color, selected を格納できる Item という名前の構造体を作ります。&lt;br&gt;&lt;br&gt;Item 構造体を作る&lt;br&gt;メニューバーの File &gt; New &gt; File... で iOS の Swift File を選択し Next をクリックして、Item.swift ファイルを生成します。&lt;br&gt;&lt;br&gt;そして、Item.swift ファイルを開いて、その中に以下のコードを追加します。&lt;br&gt;&lt;br&gt;struct Item {&lt;br&gt;    var itemID: Int&lt;br&gt;    var itemName: String&lt;br&gt;    var color: String&lt;br&gt;    var selected: Bool&lt;br&gt;    &lt;br&gt;    init(itemID: Int, itemName: String, color: String, selected: Bool) {&lt;br&gt;        self.itemID = itemID&lt;br&gt;        self.itemName = itemName&lt;br&gt;        self.color = color&lt;br&gt;        self.selected = selected&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Item の Array データを作っておく&lt;br&gt;続けて、データを表示するための Item 構造体の配列データを作っておきます。&lt;br&gt;&lt;br&gt;ViewController.swift ファイルを開いて、以下のコードを追加してください。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 3&lt;br&gt;&lt;br&gt;まずは、上のほうで items という名前の Item 型の配列を定義します。&lt;br&gt;&lt;br&gt;var items: [Item] = []&lt;br&gt;loadData() というメソッドで、それぞれの Item オブジェクトを作って、items に追加しています。&lt;br&gt;&lt;br&gt;func loadData() {&lt;br&gt;    items.append(Item(itemID: 1, itemName: &quot;Item Name 1&quot;, color: &quot;Red&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 2, itemName: &quot;Item Name 2&quot;, color: &quot;Blue&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 3, itemName: &quot;Item Name 3&quot;, color: &quot;Green&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 4, itemName: &quot;Item Name 4&quot;, color: &quot;Yellow&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 5, itemName: &quot;Item Name 5&quot;, color: &quot;Pink&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 6, itemName: &quot;Item Name 6&quot;, color: &quot;Red&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 7, itemName: &quot;Item Name 7&quot;, color: &quot;Blue&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 8, itemName: &quot;Item Name 8&quot;, color: &quot;Green&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 9, itemName: &quot;Item Name 9&quot;, color: &quot;Yellow&quot;, selected: false))&lt;br&gt;    items.append(Item(itemID: 10, itemName: &quot;Item Name 10&quot;, color: &quot;Pink&quot;, selected: false))&lt;br&gt;}&lt;br&gt;そして、viewDidLoad() の下のほうで、先ほどの loadData() を呼び出しデータを生成するようにしておきます。&lt;br&gt;&lt;br&gt;loadData()&lt;br&gt;&lt;br&gt;tableView(_:numberOfRowsInSection:) では、items.count を返すようにしておきます。&lt;br&gt;&lt;br&gt;return items.count&lt;br&gt;&lt;br&gt;チェックボックスを使う準備をする&lt;br&gt;Table View Cell でチェックボックスを使う準備をします。&lt;br&gt;&lt;br&gt;以下のようなチェックされていない状態の画像と、チェックされている状態の画像を準備します。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 unchecked&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 checked&lt;br&gt;&lt;br&gt;&lt;br&gt;二つの画像を、Assets.xcassets にドラッグ＆ドロップして追加しておきます。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、UIButton クラスを元に CheckboxButton クラスをつくります。&lt;br&gt;&lt;br&gt;メニューの File &gt; New &gt; File... から CheckboxButton.swift という名前の Swift File を追加します。&lt;br&gt;&lt;br&gt;&lt;br&gt;CheckboxButton.swift に以下のコードを追加します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;final class CheckboxButton: UIButton {&lt;br&gt;&lt;br&gt;    let checkedImage = UIImage(named: &quot;checked&quot;)! as UIImage&lt;br&gt;    let uncheckedImage = UIImage(named: &quot;unchecked&quot;)! as UIImage&lt;br&gt;&lt;br&gt;    var isChecked: Bool = false {&lt;br&gt;        didSet{&lt;br&gt;            if isChecked {&lt;br&gt;                self.setImage(checkedImage, for: .normal)&lt;br&gt;            } else {&lt;br&gt;                self.setImage(uncheckedImage, for: .normal)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;アセットに追加した checked と unchecked から、UIImage を定義しています。&lt;br&gt;&lt;br&gt;isChecked というプロパティを追加し、isChecked がセットされた時に true であれば、image を checkedImage に、false の時は uncheckedImage に設定するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Table View Cell にチェックボックスを追加する方法&lt;br&gt;ItemTableViewCell クラスを作る&lt;br&gt;まずは、カスタムの UITableViewCell のクラスをつくります。&lt;br&gt;&lt;br&gt;メニューバーの File &gt; New &gt; File... で iOS の Cocoa Touch Class を選択し Next をクリックして、Class に ItemTableViewCell、Subclass of に UITableViewCell を選択しファイルを生成します。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 6&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;Table View Cell のクラスを設定する&lt;br&gt;Item の情報を表示する Table View Cell を設定します。&lt;br&gt;&lt;br&gt;ここではざっとご説明しますので、詳細は「 Table View Cell をカスタマイズする方法 」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、Table View Cell のクラスを ItemTableViewCell を設定します。&lt;br&gt;&lt;br&gt;左側のプロジェクトナビゲーターで Main.storyboard を選択します。&lt;br&gt;&lt;br&gt;Table View Cell を選択した状態で、右側のユーティリティエリアの Identity インスペクターを選択します。&lt;br&gt;&lt;br&gt;上のほうにある Custom Class のクラスの Class のドロップダウンリストから ItemTableViewCell を選んでおきます。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;Table View Cell にオブジェクトを配置する&lt;br&gt;Table View Cell にチェックボックスや Label などのオブジェクトを配置していきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;まずは、Table View と Table View Cell の 1 行の高さを 100 に設定します。&lt;br&gt;&lt;br&gt;Table View を選択した状態で Size インスペクターを開きます。&lt;br&gt;&lt;br&gt;一番上の Table View の Row Height に 100 を設定します。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;そのまま、Table View Cell を選択し、Size インスペクターで Table View Cell の Row Height も 100 に設定します。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;次に Table View Cell を選択したまま、Attribute インスペクターを開き、Style を Custom に変更し、Identifier を ItemTableViewCell に変更しておきます。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、Table View Cell にチェックボックス用のボタンやラベルなどのオブジェクトを配置していきましょう。&lt;br&gt;&lt;br&gt;Table View Cell の左側にボタンを追加し、Image に unchecked を選択し、文字を削除します。&lt;br&gt;&lt;br&gt;ボタンの class に CheckboxButton を指定します。&lt;br&gt;&lt;br&gt;その右側に Item Name と Color を表示するための Label を、ヘッダー用・値用の二つを 2 セット配置します。&lt;br&gt;&lt;br&gt;フォントや配置などは、お好みで変更してください。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;Table View Cell のアウトレットを生成する&lt;br&gt;次に Table View Cell のアウトレットを生成します。&lt;br&gt;&lt;br&gt;ストーリーボードで、ItemTableViewCell の中のチェックボックスなど選択した状態で、メニューから Editor &gt; Assistant Editor を選択するか、Adjust Editor Options ボタンの Assistant から Assistant Editor を開きます。&lt;br&gt;&lt;br&gt;Assistant Editor が開いたら、開かれたファイルが ItemTableViewCell.swift であることを確認してください。&lt;br&gt;&lt;br&gt;違う場合は、Assistant Editor の上の Automatic をクリックして、ItemTableViewCell.swift に変更してください。&lt;br&gt;&lt;br&gt;そして、チェックボックスボタンと Item Name、Color の値用のラベルから、以下のように 3 つのアウトレットを生成しておいてください。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 13&lt;br&gt;&lt;br&gt;@IBOutlet weak var itemNameLabel: UILabel!&lt;br&gt;@IBOutlet weak var colorLabel: UILabel!&lt;br&gt;@IBOutlet weak var selectCheckboxButton: CheckboxButton!&lt;br&gt;&lt;br&gt;選択されているチェックボックスを確認するために、Table View の下のほうに SAVE ボタンを追加して、ViewController.swift に saveTapped という TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 14&lt;br&gt;&lt;br&gt;@IBAction func saveTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;これで、カスタムの Table View Cell を使う下準備は完了です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Table View でチェックボックスのデータを表示・更新する&lt;br&gt;それでは、カスタムの Table View Cell にデータを表示してみましょう。&lt;br&gt;&lt;br&gt;tableView(_:cellForRowAt:) インスタンスメソッドに次のようにコードを追加して、selectTapped() メソッドも追加します。&lt;br&gt;&lt;br&gt;func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {&lt;br&gt;    guard let cell = myTableView.dequeueReusableCell(withIdentifier: &quot;ItemTableViewCell&quot;, for: indexPath) as? ItemTableViewCell else {&lt;br&gt;        fatalError(&quot;Dequeue failed: ItemTableViewCell.&quot;)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    cell.selectionStyle = .none&lt;br&gt;    &lt;br&gt;    cell.itemNameLabel.text = items[indexPath.row].itemName&lt;br&gt;    cell.colorLabel.text = items[indexPath.row].color&lt;br&gt;    cell.selectCheckboxButton.isChecked = items[indexPath.row].selected&lt;br&gt;    &lt;br&gt;    cell.selectCheckboxButton.addTarget(self, action: #selector(selectTapped(sender:)), for: .touchUpInside)&lt;br&gt;    cell.selectCheckboxButton.tag = indexPath.row&lt;br&gt;    &lt;br&gt;    return cell&lt;br&gt;}&lt;br&gt;&lt;br&gt;@objc func selectTapped(sender: CheckboxButton){&lt;br&gt;    let row = sender.tag as Int&lt;br&gt;    sender.isChecked = !items[row].selected&lt;br&gt;    items[row].selected = !items[row].selected&lt;br&gt;}&lt;br&gt;&lt;br&gt;まず、dequeueReusableCell で得られた UITableViewCell を guard let で ItemTableViewCell 型にキャストし、失敗した時は fatalError で実行を終了するようにしています。&lt;br&gt;&lt;br&gt;そして、items 配列の indexPath.row 番目の Item オブジェクトの itemName、color、selected の値を cell の itemNameLabel.text、colorLabel.text、selectCheckboxButton.isChecked に設定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;続けて、selectCheckboxButton の addTarget() メソッドを使って、チェックボックスボタンの touchUpInside のイベントで、selectTapped() メソッドが実行されるようにしています。&lt;br&gt;&lt;br&gt;selectTapped() メソッドの中で、どの row だったかわかるように tag プロパティに indexPath.row を入れています。&lt;br&gt;&lt;br&gt;&lt;br&gt;selectTapped() メソッドでは、タグから row 番号の値を取り出し、その row 番号の Item オブジェクトの selected の値を反転させて、sender.isChecked に設定してチェックボックスの画像のON/OFFを切り替えています。&lt;br&gt;&lt;br&gt;row 番号の Item オブジェクトの selected の値も反転させています。&lt;br&gt;&lt;br&gt;&lt;br&gt;最後に saveTapped() に以下のコードを追加して、SAVE ボタンがタップされた時にチェックされている Item Name を print するようにしました。&lt;br&gt;&lt;br&gt;@IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    for item in items {&lt;br&gt;        if item.selected {&lt;br&gt;            print(&quot;\(item.itemName) selected&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    print(&quot;-----------------------------------&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;これでカスタム Table View Cell にデータを表示する為のコードを書き終わりました。&lt;br&gt;&lt;br&gt;念のため ViewController.swift の全体のコードを載せておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource  {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var myTableView: UITableView!&lt;br&gt;    var items: [Item] = []&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        myTableView.dataSource = self&lt;br&gt;        myTableView.delegate = self&lt;br&gt;        &lt;br&gt;        loadData()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func loadData() {&lt;br&gt;        items.append(Item(itemID: 1, itemName: &quot;Item Name 1&quot;, color: &quot;Red&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 2, itemName: &quot;Item Name 2&quot;, color: &quot;Blue&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 3, itemName: &quot;Item Name 3&quot;, color: &quot;Green&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 4, itemName: &quot;Item Name 4&quot;, color: &quot;Yellow&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 5, itemName: &quot;Item Name 5&quot;, color: &quot;Pink&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 6, itemName: &quot;Item Name 6&quot;, color: &quot;Red&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 7, itemName: &quot;Item Name 7&quot;, color: &quot;Blue&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 8, itemName: &quot;Item Name 8&quot;, color: &quot;Green&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 9, itemName: &quot;Item Name 9&quot;, color: &quot;Yellow&quot;, selected: false))&lt;br&gt;        items.append(Item(itemID: 10, itemName: &quot;Item Name 10&quot;, color: &quot;Pink&quot;, selected: false))&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {&lt;br&gt;        return items.count&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {&lt;br&gt;        guard let cell = myTableView.dequeueReusableCell(withIdentifier: &quot;ItemTableViewCell&quot;, for: indexPath) as? ItemTableViewCell else {&lt;br&gt;            fatalError(&quot;Dequeue failed: ItemTableViewCell.&quot;)&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        cell.selectionStyle = .none&lt;br&gt;        &lt;br&gt;        cell.itemNameLabel.text = items[indexPath.row].itemName&lt;br&gt;        cell.colorLabel.text = items[indexPath.row].color&lt;br&gt;        cell.selectCheckboxButton.isChecked = items[indexPath.row].selected&lt;br&gt;        &lt;br&gt;        cell.selectCheckboxButton.addTarget(self, action: #selector(selectTapped(sender:)), for: .touchUpInside)&lt;br&gt;        cell.selectCheckboxButton.tag = indexPath.row&lt;br&gt;        &lt;br&gt;        return cell&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @objc func selectTapped(sender: CheckboxButton){&lt;br&gt;        let row = sender.tag as Int&lt;br&gt;        sender.isChecked = !items[row].selected&lt;br&gt;        items[row].selected = !items[row].selected&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;        for item in items {&lt;br&gt;            if item.selected {&lt;br&gt;                print(&quot;\(item.itemName) selected&quot;)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        print(&quot;-----------------------------------&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルド・実行して確認してみます。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;画面が表示されるので、適当にチェックをつけ、SAVEボタンをタップします。&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 16&lt;br&gt;&lt;br&gt;Swift - Table View Cell にチェックボックスを追加する方法 17&lt;br&gt;&lt;br&gt;チェックボックスで選択した、Item Name が取得できていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Table View Cell にチェックボックスを追加して使う方法をご説明しました。</description><pubDate>Sat, 29 Jun 2024 02:24:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift でラジオボタンを作る方法</title><link>https://softmoco.com/basics/swift-how-to-create-radio-button.php</link><description>Swift でラジオボタンを作る方法&lt;br&gt;&lt;br&gt;Swift で iOS のアプリを作る時に使う UIKit の中にはラジオボタンがありません。&lt;br&gt;&lt;br&gt;ここでは、Swift でラジオボタンを作る方法をご説明します。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;テスト用の iOS アプリの作る&lt;br&gt;Swift でラジオボタンを作る方法&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;テスト用の iOS アプリの作る&lt;br&gt;まずはテスト用にラジオボタンを追加して値を取得する iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;以下のようなラジオボタンがチェックされていない状態の画像と、チェックされている状態の画像を準備します。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 radio_unchecked&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 radio_checked&lt;br&gt;&lt;br&gt;&lt;br&gt;二つの画像を、Assets.xcassets にドラッグ＆ドロップして追加しておきます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Main ストーリーボードの View Controller に、ボタン (UIButton) をひとつ追加します。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;ボタンの Title を Radio Button 1 に、Image に radio_unchecked の画像を設定し、テキストの色をダークグレーにしてフォントも変更しました。&lt;br&gt;&lt;br&gt;位置、色やフォントなどはお好みで設定してください。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;このボタンをコピペして、Title を変更して、Radio Button 2 と Radio Button 3 を作ります。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;選択されているラジオボタンを表示するために SAVE ボタンを追加しておきます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ボタンから、それぞれ radioButton1、radioButton2、radioButton3 という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 7&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var radioButton1: UIButton!&lt;br&gt;    @IBOutlet weak var radioButton2: UIButton!&lt;br&gt;    @IBOutlet weak var radioButton3: UIButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Radio Button 1 ボタンから、radioButtonTapped、Save ボタンから saveTapped という名前で Touch Up Inside のアクションを作ります。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 8&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var radioButton1: UIButton!&lt;br&gt;    @IBOutlet weak var radioButton2: UIButton!&lt;br&gt;    @IBOutlet weak var radioButton3: UIButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func radioButtonTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;View Contorller を以下の緑枠のアイコンを右クリックし、 radioButtonTapped から radioButton2 ボタンにドラッグして、TouchUpInside を選択します。&lt;br&gt;&lt;br&gt;同様にして、radioButtonTapped から radioButton3 ボタンにドラッグして、Touch Up Inside を選択しておきます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 9&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、radioButton1、radioButton2、radioButton3 の Touch Up Inside イベントで radioButtonTapped が実行されるようになりました。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法&lt;br&gt;それでは、Swift でラジオボタンを作るコードを書いていきましょう。&lt;br&gt;&lt;br&gt;やり方はいろいろあるかと思いますが、ここでは UIButton クラスを元に RadioButton クラスをつくります。&lt;br&gt;&lt;br&gt;&lt;br&gt;メニューの File &gt; New &gt; File... から RadioButton.swift という名前の Swift File を追加します。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;RadioButton.swift に以下のコードを追加します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;@IBDesignable&lt;br&gt;final class RadioButton: UIButton {&lt;br&gt;&lt;br&gt;    let checkedImage = UIImage(named: &quot;radio_checked&quot;)! as UIImage&lt;br&gt;    let uncheckedImage = UIImage(named: &quot;radio_unchecked&quot;)! as UIImage&lt;br&gt;&lt;br&gt;    var isChecked: Bool = false {&lt;br&gt;        didSet{&lt;br&gt;            if isChecked {&lt;br&gt;                self.setImage(checkedImage, for: .normal)&lt;br&gt;            } else {&lt;br&gt;                self.setImage(uncheckedImage, for: .normal)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift でラジオボタンを作る方法 18&lt;br&gt;&lt;br&gt;&lt;br&gt;アセットに追加した radio_checked と radio_unchecked から、UIImage を定義しています。&lt;br&gt;&lt;br&gt;isChecked というプロパティを追加し、isChecked がセットされた時に true であれば、image を checkedImage に、false の時は uncheckedImage に設定するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Main.storyboard で Radio Button ボタンを選択し、Class に RadioButton を設定し、アウトレットのクラスも RadioButton に変更しておきます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 13&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var radioButton1: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton2: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton3: RadioButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func radioButtonTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;次に、メニューの File &gt; New &gt; File... から RadioButtonGroup.swift という名前の Swift File を追加します。&lt;br&gt;&lt;br&gt;RadioButtonGroup.swift に以下のコードを追加します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;final class RadioButtonGroup: NSObject {&lt;br&gt;    var radioButtons: [RadioButton]!&lt;br&gt;    var selected: RadioButton?&lt;br&gt;&lt;br&gt;    func changed(selected: RadioButton) {&lt;br&gt;        for rb in radioButtons {&lt;br&gt;            if rb == selected {&lt;br&gt;                self.selected = rb&lt;br&gt;                rb.isChecked = true&lt;br&gt;            } else {&lt;br&gt;                rb.isChecked = false&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift でラジオボタンを作る方法 19&lt;br&gt;&lt;br&gt;&lt;br&gt;RadioButtonGroup クラスでは、グルーピングしたい RadioButton を radioButtons に配列として保持しています。&lt;br&gt;&lt;br&gt;changed() で selected にセットされたラジオボタンの isChecked を true に、それ以外のラジオボタンの isChecked を false にしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController で RadioButtonGroup を生成して、viewDidLoad() で初期設定をします。&lt;br&gt;&lt;br&gt;最初は radioButton1 を選択状態にしています。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var radioButton1: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton2: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton3: RadioButton!&lt;br&gt;    &lt;br&gt;    var radioButtonGroup: RadioButtonGroup = RadioButtonGroup()&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        radioButtonGroup.radioButtons = [radioButton1, radioButton2, radioButton3]&lt;br&gt;        radioButtonGroup.changed(selected: radioButton1)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func radioButtonTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;次に、radioButtonTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var radioButton1: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton2: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton3: RadioButton!&lt;br&gt;    &lt;br&gt;    var radioButtonGroup: RadioButtonGroup = RadioButtonGroup()&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        radioButtonGroup.radioButtons = [radioButton1, radioButton2, radioButton3]&lt;br&gt;        radioButtonGroup.changed(selected: radioButton1)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func radioButtonTapped(_ sender: Any) {&lt;br&gt;        guard let radioButton = sender as? RadioButton else { return }&lt;br&gt;        radioButtonGroup.changed(selected: radioButton)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;radioButton1、radioButton2、radioButton3 のどれかがタップされた時に、sender を RadioButton にキャストして、radioButtonGroup.changed() メソッドを実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;最後に、Save ボタンがタップされた時に、選択されているラジオボタンがどれかを print するために saveTapped() を以下のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var radioButton1: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton2: RadioButton!&lt;br&gt;    @IBOutlet weak var radioButton3: RadioButton!&lt;br&gt;    &lt;br&gt;    var radioButtonGroup: RadioButtonGroup = RadioButtonGroup()&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        radioButtonGroup.radioButtons = [radioButton1, radioButton2, radioButton3]&lt;br&gt;        radioButtonGroup.changed(selected: radioButton1)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func radioButtonTapped(_ sender: Any) {&lt;br&gt;        guard let radioButton = sender as? RadioButton else { return }&lt;br&gt;        radioButtonGroup.changed(selected: radioButton)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;        switch radioButtonGroup.selected {&lt;br&gt;        case radioButton1:&lt;br&gt;            print(&quot;Radio Button 1 が選択されています。&quot;)&lt;br&gt;        case radioButton2:&lt;br&gt;            print(&quot;Radio Button 2 が選択されています。&quot;)&lt;br&gt;        case radioButton3:&lt;br&gt;            print(&quot;Radio Button 3 が選択されています。&quot;)&lt;br&gt;        default:&lt;br&gt;            print(&quot;選択されていません。&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift でラジオボタンを作る方法 14&lt;br&gt;&lt;br&gt;以上が、Swift でラジオボタンを作るコードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルド・実行して確認してみます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターが起動し、画面が表示されます。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 16&lt;br&gt;&lt;br&gt;&lt;br&gt;Radio Button 2 を選択して、SAVE ボタンをタップします。&lt;br&gt;&lt;br&gt;Swift でラジオボタンを作る方法 17&lt;br&gt;&lt;br&gt;アウトプット画面に「Radio Button 2 が選択されています。」と表示されました。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift でラジオボタンを作る方法をご説明しました。</description><pubDate>Wed, 26 Jun 2024 18:33:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift でチェックボックスを作る方法</title><link>https://softmoco.com/basics/swift-how-to-create-checkbox.php</link><description>Swift でチェックボックスを作る方法&lt;br&gt;&lt;br&gt;Swift で iOS のアプリを作る時に使う UIKit の中にはチェックボックスがありません。&lt;br&gt;&lt;br&gt;ここでは、Swift でチェックボックスを作る方法をご説明します。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;テスト用の iOS アプリの作る&lt;br&gt;Swift でチェックボックスを作る方法&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;テスト用の iOS アプリの作る&lt;br&gt;まずはテスト用にチェックボックスを追加して値を取得する iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;以下のようなチェックされていない状態の画像と、チェックされている状態の画像を準備します。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 2&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;二つの画像を、Assets.xcassets にドラッグ＆ドロップして追加しておきます。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Main ストーリーボードの View Controller に、ボタン (UIButton) をひとつ追加します。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;ボタンの Title を Checkbox 1 に、Image に Unchecked の画像を設定し、テキストの色をダークグレーにしてフォントも変更しました。&lt;br&gt;&lt;br&gt;位置、色やフォントなどはお好みで設定してください。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;このボタンをコピペーして、Title を変更して、Checkbox 2 と Checkbox 3 を作ります。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;チェックボックスの値を表示するために Save ボタンを追加しておきます。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ボタンから、それぞれ checkbox1Button、checkbox2Button、checkbox3Button という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 7&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var checkbox1Button: UIButton!&lt;br&gt;    @IBOutlet weak var checkbox2Button: UIButton!&lt;br&gt;    @IBOutlet weak var checkbox3Button: UIButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Checkbox 1 ボタンから、checkboxTapped、Save ボタンから saveTapped という名前で Touch Up Inside のアクションを作ります。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 8&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var checkbox1Button: UIButton!&lt;br&gt;    @IBOutlet weak var checkbox2Button: UIButton!&lt;br&gt;    @IBOutlet weak var checkbox3Button: UIButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func checkboxTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;View Contorller を以下の緑枠のアイコンを右クリックし、 checkboxTapped から checkbox2Button ボタンにドラッグして、TouchUpInside を選択します。&lt;br&gt;&lt;br&gt;同様にして、checkboxTapped から checkbox3Button ボタンにドラッグして、Touch Up Inside を選択しておきます。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 9&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、checkbox1Button、checkbox2Button、checkbox3Button の Touch Up Inside イベントで checkboxTapped が実行されるようになりました。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法&lt;br&gt;それでは、Swift でチェックボックスを作るコードを書いていきましょう。&lt;br&gt;&lt;br&gt;やり方はいろいろあるかと思いますが、ここでは UIButton クラスを元に CheckboxButton クラスをつくります。&lt;br&gt;&lt;br&gt;&lt;br&gt;メニューの File &gt; New &gt; File... から CheckboxButton.swift という名前の Swift File を追加します。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;CheckboxButton.swift に以下のコードを追加します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;@IBDesignable&lt;br&gt;final class CheckboxButton: UIButton {&lt;br&gt;&lt;br&gt;    let checkedImage = UIImage(named: &quot;checked&quot;)! as UIImage&lt;br&gt;    let uncheckedImage = UIImage(named: &quot;unchecked&quot;)! as UIImage&lt;br&gt;&lt;br&gt;    var isChecked: Bool = false {&lt;br&gt;        didSet{&lt;br&gt;            if isChecked {&lt;br&gt;                self.setImage(checkedImage, for: .normal)&lt;br&gt;            } else {&lt;br&gt;                self.setImage(uncheckedImage, for: .normal)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift でチェックボックスを作る方法 18&lt;br&gt;&lt;br&gt;&lt;br&gt;アセットに追加した checked と unchecked から、UIImage を定義しています。&lt;br&gt;&lt;br&gt;isChecked というプロパティを追加し、isChecked がセットされた時に true であれば、image を checkedImage に、false の時は uncheckedImage に設定するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Main.storyboard で Checkbox ボタンを選択し、Class に CheckboxButton を設定し、アウトレットのクラスも CheckboxButton に変更しておきます。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 13&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var checkbox1Button: CheckboxButton!&lt;br&gt;    @IBOutlet weak var checkbox2Button: CheckboxButton!&lt;br&gt;    @IBOutlet weak var checkbox3Button: CheckboxButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func checkboxTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;次に、checkboxTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var checkbox1Button: CheckboxButton!&lt;br&gt;    @IBOutlet weak var checkbox2Button: CheckboxButton!&lt;br&gt;    @IBOutlet weak var checkbox3Button: CheckboxButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func checkboxTapped(_ sender: Any) {&lt;br&gt;        guard let checkbox = sender as? CheckboxButton else { return }&lt;br&gt;        checkbox.isChecked = !checkbox.isChecked&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;checkbox1Button、checkbox2Button、checkbox3Button のどれかがタップされた時に、sender を CheckboxButton にキャストして、isChecked に反対の値をセットしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;最後に、Save ボタンがタップされた時に、checkbox1Button、checkbox2Button、checkbox3Button の値を表示するようにsaveTapped() を以下のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var checkbox1Button: CheckboxButton!&lt;br&gt;    @IBOutlet weak var checkbox2Button: CheckboxButton!&lt;br&gt;    @IBOutlet weak var checkbox3Button: CheckboxButton!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func checkboxTapped(_ sender: Any) {&lt;br&gt;        guard let checkbox = sender as? CheckboxButton else { return }&lt;br&gt;        checkbox.isChecked = !checkbox.isChecked&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveTapped(_ sender: Any) {&lt;br&gt;        let message = &quot;&quot;&quot;&lt;br&gt;                      Checkbox 1: \(checkbox1Button.isChecked)&lt;br&gt;                      Checkbox 2: \(checkbox2Button.isChecked)&lt;br&gt;                      Checkbox 3: \(checkbox3Button.isChecked)&lt;br&gt;                      &quot;&quot;&quot;&lt;br&gt;        &lt;br&gt;        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert)&lt;br&gt;        &lt;br&gt;        alert.addAction(UIAlertAction(title: &quot;OK&quot;, style: .default))&lt;br&gt;        present(alert, animated: true, completion: nil)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift でチェックボックスを作る方法 14&lt;br&gt;&lt;br&gt;チェックボックの isChecked を表示する文字列を作って、UIAlertController をつかって、アラート画面を出しています。&lt;br&gt;&lt;br&gt;以上が、Swift でチェックボックスを作るコードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルド・実行して確認してみます。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;画面が表示されるので、適当にチェックをつけ、SAVEボタンをタップします。&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 16&lt;br&gt;&lt;br&gt;Swift でチェックボックスを作る方法 17&lt;br&gt;&lt;br&gt;チェックボックスの値が取得できていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift でチェックボックスを作る方法をご説明しました。</description><pubDate>Tue, 25 Jun 2024 03:40:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - UILabel の一部の文字を太字する・色を変える方法</title><link>https://softmoco.com/basics/swift-how-to-make-part-of-label-bold.php</link><description>Swift - UILabel の一部の文字を太字する・色を変える方法&lt;br&gt;&lt;br&gt;ここでは、Swift で UILabel の一部の文字を太字にしたり、色を変えたりする方法をご説明します。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;テスト用の iOS アプリの作成する&lt;br&gt;Swift で UILabel の一部の文字を太字する・色を変える方法&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;テスト用の iOS アプリの作成する&lt;br&gt;まずはテスト用に UILabel を表示するだけの iOS アプリを作ります。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;場所などは適当で良いので、Main ストーリーボードの View Controller に、ラベル (UILabel) をひとつ追加します。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 2&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;Label から itemNameLabel という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 4&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var itemNameLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift で UILabel の一部の文字を太字する・色を変える方法&lt;br&gt;それでは、Swift で UILabel の一部の文字を太字する・色を変えるコードを書いていきましょう。&lt;br&gt;&lt;br&gt;今回は、itemNameLabel というひとつのラベルに、太字でヘッダー名、続いてアイテム名、続いて赤字で * （アスタリスク）を表示してみます。&lt;br&gt;&lt;br&gt;&lt;br&gt;ラベルに表示する文字のフォントなどを変更するには、NSAttributedString と NSMutableAttributedString を生成して、UILabel の attributedText に設定します。&lt;br&gt;&lt;br&gt;ViewController.swift を以下のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var itemNameLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        let headerText = &quot;Item&quot;&lt;br&gt;        let valueText = &quot;Item Name ABC&quot;&lt;br&gt;        let colorText = &quot;*&quot;&lt;br&gt;        &lt;br&gt;        if let headerFont = UIFont(name: &quot;Verdana Bold&quot;, size: 17),&lt;br&gt;           let valueFont = UIFont(name: &quot;Verdana&quot;, size: 17) {&lt;br&gt;            &lt;br&gt;            let asHeader = [NSAttributedString.Key.font : headerFont]&lt;br&gt;            let asValue = [NSAttributedString.Key.font : valueFont]&lt;br&gt;            let asColorRed = [NSAttributedString.Key.font : valueFont, NSAttributedString.Key.foregroundColor: UIColor.red]&lt;br&gt;            &lt;br&gt;            let maString = NSMutableAttributedString(string: &quot;\(headerText): &quot;, attributes: asHeader)&lt;br&gt;            maString.append(NSMutableAttributedString(string: &quot;\(valueText) &quot;, attributes: asValue))&lt;br&gt;            maString.append(NSMutableAttributedString(string:  &quot;\(colorText)&quot;, attributes: asColorRed))&lt;br&gt;            &lt;br&gt;            itemNameLabel.attributedText = maString&lt;br&gt;        } else {&lt;br&gt;            itemNameLabel.attributedText = NSMutableAttributedString(string: &quot;\(headerText): \(valueText) \(colorText)&quot;);&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;コードを順を追って説明します。&lt;br&gt;&lt;br&gt;まず、10 ~ 12 行目でラベルに表示する文字列をフォントの属性（太字、通常、色つき）を変えたい部分に分けて定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は、ヘッダーの太字部分には Verdana Bold、値の部分には Verdana フォントで、サイズは 17 を使います。&lt;br&gt;&lt;br&gt;10 ~ 12 行目でフォントとサイズを指定して、ヘッダーと値の部分の UIFont を if let で生成しています。&lt;br&gt;&lt;br&gt;UIFont の生成が失敗して nil が返った時は、else の 27 行目が実行され、属性の指定なしで、ラベルにテキスト表示されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;17 行目で、Font: Verdana Bold / Size 17 の UIFont を指定して、headerText の部分に使う NSAttributedString を生成しています。&lt;br&gt;&lt;br&gt;18 行目で、Font: Verdana / Size 17 の UIFont を指定して、valueText の部分に使う NSAttributedString を生成しています。&lt;br&gt;&lt;br&gt;19 行目で、Font: Verdana / Size 17 の UIFont と、色を赤に指定して、colorText の部分に使う NSAttributedString を生成しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;21 行目で、headerText に、ヘッダー部分の NSAttributedString を指定して、maString という名前でNSMutableAttributedString を生成しています。&lt;br&gt;&lt;br&gt;22 行目では、valueText に、値部分の NSAttributedString を指定して、NSMutableAttributedString を生成して maString に追加しています。&lt;br&gt;&lt;br&gt;23 行目では、colorText に、色部分の NSAttributedString を指定して、NSMutableAttributedString を生成して maString に追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;25 行目でラベルの attributedText に maString を代入して、ラベルにフォント属性付きのテキストを表示しています。&lt;br&gt;&lt;br&gt;以上が、Swift で UILabel の一部の文字を太字する・色を変えるコードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルド・実行して確認してみます。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ラベルの文字が Item: が太字、* が赤で表示されました。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;試しに headerFont と asColorRed を以下のように変更して実行してみます。&lt;br&gt;&lt;br&gt;if let headerFont = UIFont(name: &quot;Copperplate Bold&quot;, size: 22),&lt;br&gt;let asColorRed = [NSAttributedString.Key.font : valueFont, NSAttributedString.Key.foregroundColor: UIColor.blue]&lt;br&gt;&lt;br&gt;これで、再度実行すると、ヘッダーのフォントが変わって、* の色もブルーになっていますね。&lt;br&gt;&lt;br&gt;UILabel の一部の文字を太字する・色を変える方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で UILabel の一部の文字を太字にしたり、色を変えたりする方法をご説明しました。</description><pubDate>Tue, 07 May 2024 01:21:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - Photo Library から複数の画像を選択する方法</title><link>https://softmoco.com/basics/swift-how-to-select-multiple-photos-from-photo-library.php</link><description>Swift - Photo Library から複数の画像を選択する方法&lt;br&gt;&lt;br&gt;ここでは、Swift で PHPickerViewController を使って、Photo Library から複数の画像を選択する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;テスト用の iOS アプリの作成する&lt;br&gt;Swift で Photo Library から複数の画像を選択する方法&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;テスト用の iOS アプリの作成する&lt;br&gt;まずはテスト用に Photo Library から複数の画像を選択する iOS アプリを作ります。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に、ファイル名を表示する用のラベルを三つ、選択した画像を表示するようの Image View を三つ、ボタン (Select from Photo Library) をひとつ追加します。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Label から fileNameLabel1、fileNameLabel2、fileNameLabel3、Image View から imageView1、imageView2、imageView3 という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 2&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var fileNameLabel1: UILabel!&lt;br&gt;    @IBOutlet weak var fileNameLabel2: UILabel!&lt;br&gt;    @IBOutlet weak var fileNameLabel3: UILabel!&lt;br&gt;    @IBOutlet weak var imageView1: UIImageView!&lt;br&gt;    @IBOutlet weak var imageView2: UIImageView!&lt;br&gt;    @IBOutlet weak var imageView3: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Select from Photo Library ボタンから selectTapped という名前で touchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var fileNameLabel1: UILabel!&lt;br&gt;    @IBOutlet weak var fileNameLabel2: UILabel!&lt;br&gt;    @IBOutlet weak var fileNameLabel3: UILabel!&lt;br&gt;    @IBOutlet weak var imageView1: UIImageView!&lt;br&gt;    @IBOutlet weak var imageView2: UIImageView!&lt;br&gt;    @IBOutlet weak var imageView3: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func selectTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;ImageFile.swift という名前のファイルを追加して、以下のような ImageFile という名前の struct を定義しておきます。&lt;br&gt;&lt;br&gt;選択されたファイルの情報を保持するのに使います。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;struct ImageFile {&lt;br&gt;    var FileName: String?&lt;br&gt;    var ImageData: UIImage?&lt;br&gt;}&lt;br&gt;Photo Library から複数の画像を選択する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で Photo Library から複数の画像を選択する方法&lt;br&gt;それでは、Swift で Photo Library から複数の画像を選択するコードを書いていきましょう。&lt;br&gt;&lt;br&gt;ここでは、PHPickerViewController を使います。&lt;br&gt;&lt;br&gt;PHPickerViewController は Photo Library にある画像を選択する UI と機能を提供してくれる view controller です。&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController.swift を以下のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import PhotosUI&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, PHPickerViewControllerDelegate {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var fileNameLabel1: UILabel!&lt;br&gt;    @IBOutlet weak var fileNameLabel2: UILabel!&lt;br&gt;    @IBOutlet weak var fileNameLabel3: UILabel!&lt;br&gt;    @IBOutlet weak var imageView1: UIImageView!&lt;br&gt;    @IBOutlet weak var imageView2: UIImageView!&lt;br&gt;    @IBOutlet weak var imageView3: UIImageView!&lt;br&gt;    &lt;br&gt;    var phPicker: PHPickerViewController!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())&lt;br&gt;        config.filter = .images&lt;br&gt;        config.selectionLimit = 3&lt;br&gt;        &lt;br&gt;        phPicker = PHPickerViewController(configuration: config)&lt;br&gt;        phPicker.delegate = self&lt;br&gt;        &lt;br&gt;        resetFiles()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func resetFiles() {&lt;br&gt;        fileNameLabel1.text = &quot;&quot;&lt;br&gt;        fileNameLabel2.text = &quot;&quot;&lt;br&gt;        fileNameLabel3.text = &quot;&quot;&lt;br&gt;        imageView1.image = nil&lt;br&gt;        imageView2.image = nil&lt;br&gt;        imageView3.image = nil&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func selectTapped(_ sender: Any) {&lt;br&gt;        present(phPicker, animated: true)&lt;br&gt;    }&lt;br&gt;        &lt;br&gt;    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {&lt;br&gt;        picker.dismiss(animated: true)&lt;br&gt;        &lt;br&gt;        if results.isEmpty {&lt;br&gt;            return&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        var selectedOrder = [String]()&lt;br&gt;        var dictImages = [String:ImageFile]()&lt;br&gt;        &lt;br&gt;        let group = DispatchGroup()&lt;br&gt;        for result in results {&lt;br&gt;            let id = result.assetIdentifier ?? &quot;&quot;&lt;br&gt;            selectedOrder.append(id)&lt;br&gt;            &lt;br&gt;            group.enter()&lt;br&gt;            let provider = result.itemProvider&lt;br&gt;            if provider.canLoadObject(ofClass: UIImage.self) {&lt;br&gt;                provider.loadObject(ofClass: UIImage.self) { image, _ in&lt;br&gt;                    if let img = image as? UIImage {&lt;br&gt;                        dictImages[id] = ImageFile(FileName: provider.suggestedName, ImageData: img)&lt;br&gt;                    }&lt;br&gt;                    group.leave()&lt;br&gt;                }&lt;br&gt;            } else {&lt;br&gt;                group.leave()&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        group.notify(queue: .main) {&lt;br&gt;            var images = [ImageFile]()&lt;br&gt;            for id in selectedOrder {&lt;br&gt;                if dictImages[id] != nil {&lt;br&gt;                    images.append(dictImages[id]!)&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;            self.displayFiles(images: images)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func displayFiles(images: [ImageFile]) {&lt;br&gt;        resetFiles()&lt;br&gt;        &lt;br&gt;        for (i, image) in images.enumerated() {&lt;br&gt;            if i == 0 {&lt;br&gt;                fileNameLabel1.text = image.FileName&lt;br&gt;                imageView1.image = image.ImageData&lt;br&gt;            } else if i == 1 {&lt;br&gt;                fileNameLabel2.text = image.FileName&lt;br&gt;                imageView2.image = image.ImageData&lt;br&gt;            } else if i == 2 {&lt;br&gt;                fileNameLabel3.text = image.FileName&lt;br&gt;                imageView3.image = image.ImageData&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Photo Library から複数の画像を選択する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;コードを順を追って説明します。&lt;br&gt;&lt;br&gt;まず、PHPickerViewController を使うので、2 行目で、PhotosUI を import して、 4 行目に PHPickerViewControllerDelegate を追加しています。&lt;br&gt;&lt;br&gt;13 行目で phPicker という名前で PHPickerViewController を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;viewDidLoad() の 18 ~ 23 行目で、PHPickerViewController の設定をしています。&lt;br&gt;&lt;br&gt;PHPickerConfiguration を定義して、filter では images 画像ファイルのみを選択するように指定し、selectionLimit で選択できる最大の数を 3 に設定しています。&lt;br&gt;&lt;br&gt;selectionLimit の default は 1 で、最大数を設定したくない場合は 0 にします。&lt;br&gt;&lt;br&gt;この config を指定して、phPicker を生成し、画像が選択された時に picker(_:didFinishPicking:) が呼ばれるように delegate に self を指定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;resetFiles() は、label と Image View をクリアしているだけです。&lt;br&gt;&lt;br&gt;37 ~ 39 行目の selectTapped() で、present(phPicker, animated: true) で、ボタンがタップされた時に画像の選択画面が表示されるようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;画像選択画面で、Add や Cancel ボタンがタップされた時に picker(_:didFinishPicking:) が呼ばれます。&lt;br&gt;&lt;br&gt;42 行目で、選択画面を close しています。&lt;br&gt;&lt;br&gt;results に選択されたアセットが入ってきますが、Cancel がタップされた場合は要素数が 0 になるので、return しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は選択された順番を保持するようなコードにしています。&lt;br&gt;&lt;br&gt;results の中のアセットをループして、itemProvider の loadObject で画像を抽出しています。&lt;br&gt;&lt;br&gt;loadObject の completionHandler が呼ばれる順番が、画像が選択された順番になるとは限りません。&lt;br&gt;&lt;br&gt;そこで、選択順を保持するために、DispatchGroup を使っています。&lt;br&gt;&lt;br&gt;enter() が呼ばれた後、全ての leave() が呼ばれてから、notify() が実行されます。&lt;br&gt;&lt;br&gt;選択されたアセットの id を順番に selectedOrder に保存しておいて、notify() で仮に dictImages 保存しておいたファイル名を画像データを選択順になるように配列を生成しています。&lt;br&gt;&lt;br&gt;選択された順番を保持する必要がない場合は、id の順番を保持したり、DispatchGroup をつかわずに、loadObject() を実行して画像を抽出していくだけでよいと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;displayFiles() では、選択順に入っている ImageFile の配列のデータを Label と Image View に表示しています。&lt;br&gt;&lt;br&gt;以上が、Swift で Photo Library から複数の画像を選択するコードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルドして実行してみましょう。&lt;br&gt;&lt;br&gt;ツールバー左側の  ボタンをクリックすると、選択されているシミュレータが立ち上がり、アプリがインストールされて実行されます。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;Select from Photo Library ボタンをタップします。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;Photo Library の画像を選択する画面が表示されます。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;写真を三つ選択して、Add ボタンをタップします。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;選択画面が閉じ、メインの画面に選択した画像とファイル名が選択した順番に表示されます。&lt;br&gt;&lt;br&gt;Photo Library から複数の画像を選択する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で PHPickerViewController を使って、Photo Library から複数の画像を選択する方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Tue, 28 Nov 2023 23:50:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法</title><link>https://softmoco.com/devenv/how-to-run-app-on-iphone-wirelessly.php</link><description>Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法&lt;br&gt;&lt;br&gt;ここでは、Xcode からネットワークを介して、ワイヤレスで iPhone に開発した iOS アプリをインストールする方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;開発中に iOS アプリを iPhone などのデバイスにインストールしてデバッグやテストすると思います。&lt;br&gt;&lt;br&gt;そんな時は、Mac にケーブルで iOS デバイスを接続して、以下のようにインストールしたいデバイスを選択して実行しますね。&lt;br&gt;&lt;br&gt;Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法 1&lt;br&gt;&lt;br&gt;ここで、ケーブルを使わずに iPhone に iOS アプリを Xcode からインストールすることができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;まず、Xcode を利用している Mac と iOS アプリをインストールしたい iPhone は同じネットワークに接続されている必要があります。&lt;br&gt;&lt;br&gt;ワイヤレスで接続したい iOS デバイスをケーブルで Mac に接続しておきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode の Window メニューから Devices and Simulators を選択します。&lt;br&gt;&lt;br&gt;Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Devices に接続されている iPhone が表示されているので、選択します。&lt;br&gt;&lt;br&gt;Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;Connect via network をオンにします。 デバイス名の横に地球儀マークがつきます。&lt;br&gt;&lt;br&gt;Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法 4&lt;br&gt;&lt;br&gt;これで、ネットワークを介して、ワイヤレスで iPhone に開発した iOS アプリをインストールできるようになりました。&lt;br&gt;&lt;br&gt;&lt;br&gt;以下のように、ケーブルを抜いても、このデバイスがリストに表示され、選択してアプリをインストールすることができます。&lt;br&gt;&lt;br&gt;こちらにもデバイス名の横に地球儀マークが表示されていますね。&lt;br&gt;&lt;br&gt;Xcode から iOS アプリをワイヤレスで iPhone にインストールする方法 5&lt;br&gt;&lt;br&gt;もし、インストールしようとした時に変なエラーが出た場合は、一度 Xcode を再起動して試してみてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode からネットワークを介して、ワイヤレスで iPhone に開発した iOS アプリをインストールする方法をご紹介しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 22 Sep 2023 00:29:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>iOS アプリでプログレスバー (UIProgressView) を使う方法 (Swift)</title><link>https://softmoco.com/basics/how-to-use-progress-view.php</link><description>iOS アプリでプログレスバー (UIProgressView) を使う方法 (Swift)&lt;br&gt;&lt;br&gt;何か時間のかかる処理をする際に、プログレスバーを表示したいことがあるかもしれません。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は iOS アプリでプログレスバー (UIProgressView) を使う方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;プログレスバーを使う iOS アプリの準備をする&lt;br&gt;Swift でプログレスバー (UIProgressView) を使う方法&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;プログレスバーを使う iOS アプリの準備をする&lt;br&gt;まずはテスト用に Picker View を使う iOS アプリを作ります。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に、ボタン (Start) をひとつ、Progress View をひとつ、Label (0 %)をひとつ追加します。&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;UIProgressView から progressView、UILabel から progressLabel という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 2&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var progressView: UIProgressView!&lt;br&gt;    @IBOutlet weak var progressLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Start ボタンから startButtonTapped という名前で touchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var progressView: UIProgressView!&lt;br&gt;    @IBOutlet weak var progressLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func startButtonTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift でプログレスバー (UIProgressView) を使う方法&lt;br&gt;それでは、Swift でプログレスバー (UIProgressView) を使うコードを書いていきましょう。&lt;br&gt;&lt;br&gt;スタートボタンをタップした時に、0 % からスタートして、プログレスバーの進捗を 100% まで表示します。&lt;br&gt;&lt;br&gt;ViewController.swift を以下のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var progressView: UIProgressView!&lt;br&gt;    @IBOutlet weak var progressLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        progressView.progressTintColor = UIColor.orange&lt;br&gt;        progressView.transform = progressView.transform.scaledBy(x: 1, y: 3)&lt;br&gt;        updateProgress(0.0)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func updateProgress(_ progress: Float) {&lt;br&gt;        progressView.progress = progress&lt;br&gt;        progressView.setProgress(progress, animated: true)&lt;br&gt;        progressLabel.text = &quot;\(String(format: &quot;%.0f&quot;,progress * 100)) %&quot;&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func startButtonTapped(_ sender: Any) {&lt;br&gt;        var progress: Float = 0.0&lt;br&gt;        updateProgress(progress)&lt;br&gt;&lt;br&gt;        DispatchQueue.global().async {&lt;br&gt;            for _ in 1...50 {&lt;br&gt;                usleep(50000)&lt;br&gt;                progress += 0.02&lt;br&gt;                DispatchQueue.main.async {&lt;br&gt;                    self.updateProgress(progress)&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;コードを順を追って説明します。&lt;br&gt;&lt;br&gt;viewDidLoad() 内、11 行目の progressView.progressTintColor = UIColor.orange でプログレスバーの色をオレンジに設定しています。&lt;br&gt;&lt;br&gt;12 行目の progressView.transform = progressView.transform.scaledBy(x: 1, y: 3) でプログレスバーの縦のサイズを 3 倍に大きくしています。&lt;br&gt;&lt;br&gt;13 行目で updateProgress() 関数に 0.0 を渡して実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;updateProgress() 関数 は、Float 型の progress を入力引数として受け取ります。&lt;br&gt;&lt;br&gt;17 行目で progress を progressView.progress に代入しています。&lt;br&gt;&lt;br&gt;18 行目で progressView.setProgress(progress, animated: true) で progress を設定して、プログレスバーを表示しています。&lt;br&gt;&lt;br&gt;19 行目の progressLabel.text = &quot;\(String(format: &quot;%.0f&quot;,progress * 100)) %&quot; でラベルに進捗 % を表示しています。&lt;br&gt;&lt;br&gt;setProgress() だけでも UIProgressView の progress の値が更新されるはずですが、この記事を書いている時点では progress プロパティの値も更新しないと、不具合で特定の状況でプログレスバーの表示が戻ったりすることがあります。&lt;br&gt;&lt;br&gt;興味のある方は 17 行目を消して、Start ボタンをタップして、100% までいったら、もう一度 Start ボタンをタップしてみてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;startButtonTapped() では、スリープさせて時間のかかる処理をシミュレーションしています。&lt;br&gt;&lt;br&gt;23 行目で進捗を保持するフロート型の progress 変数を定義し、0.0 を代入しています。&lt;br&gt;&lt;br&gt;24 行目で progressView と progressLabel を 0.0 にリセットしています。&lt;br&gt;&lt;br&gt;ループしてスリープさせながら、progress を少しずつ増やしますが、メインスレッドでやるとループが終わるまで表示が更新されないので、DispatchQueue.global().async を使って、グローバルシステムキューの非同期で別スレッドで実行します。&lt;br&gt;&lt;br&gt;1 ~ 50 まで、0.05 秒スリープさせながら、progress を 0.02 ずつ追加しています。&lt;br&gt;&lt;br&gt;数字にこだわりはありません。試してみてちょうど良い進み具合だったからで、progress を 0.0 ~ 1.0 まで順番に増やせればなんでも OK です。&lt;br&gt;&lt;br&gt;usleep() 関数は指定した microsecond 分、そのスレッドをスリープします。&lt;br&gt;&lt;br&gt;30 ~ 32 行目で、更新された progress を渡して、メインスレッドで updateProgress() を実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上が、Swift でプログレスバー (UIProgressView) を使うコードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルドして実行してみましょう。&lt;br&gt;&lt;br&gt;ツールバー左側の  ボタンをクリックすると、選択されているシミュレータが立ち上がり、アプリがインストールされて実行されます。&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 5&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;Start ボタンをタップすると、プログレスバーとプログレス％が 100% まで更新されていきます。&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 7&lt;br&gt;&lt;br&gt;iOS アプリでプログレスバー (UIProgressView) を使う方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iOS アプリでプログレスバー (UIProgressView) を使う方法をご説明しました。</description><pubDate>Tue, 05 Sep 2023 23:14:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift の Extension</title><link>https://softmoco.com/swift-basics/swift-extension.php</link><description>Swift の Extension&lt;br&gt;&lt;br&gt;ここでは Swift の Extension についてご説明します。&lt;br&gt;&lt;br&gt;Swift の Extension を使う&lt;br&gt;Swift の Extension を使うと、既存の class、struct、enum などに機能を追加することができます。&lt;br&gt;&lt;br&gt;既存のコードを変更せずに機能を追加したい時や、ソースの管理のしやすさのために機能を分けたい時などに便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Extension は次のような構文で追加することができます。&lt;br&gt;&lt;br&gt;extension タイプ名 {&lt;br&gt;    // 追加の機能&lt;br&gt;}&lt;br&gt;タイプ名には extend するクラス名などが入ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、実際に Extension を使って、Date クラスに機能を追加してみます。&lt;br&gt;&lt;br&gt;Date 型をフォーマットされた文字列を取得する方法を「Swift で日付(Date)をフォーマットされた文字列(String)に変換する」でご紹介しました。&lt;br&gt;&lt;br&gt;シンプルな変換は以下のコードできます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let date = Date()&lt;br&gt;&lt;br&gt;let df = DateFormatter()&lt;br&gt;df.dateFormat = &quot;yyyy-MM-dd HH:mm:ss&quot;&lt;br&gt;&lt;br&gt;print(df.string(from: date))&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;2023-08-16 20:14:00&lt;br&gt;Swift の Extension 1&lt;br&gt;&lt;br&gt;&lt;br&gt;これを、Date クラスの Extension として実装してみます。&lt;br&gt;&lt;br&gt;extension Date {&lt;br&gt;    func toString(format: String) -&gt; String {&lt;br&gt;        let df = DateFormatter()&lt;br&gt;        df.dateFormat = format&lt;br&gt;        return df.string(from: self)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;extension Date { ... }で Date クラスに機能を追加しています。&lt;br&gt;&lt;br&gt;format 用の文字列を入力引数として受けとって、日付をフォーマットした文字列を返す、toString 関数を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;そして次のように、この extension で定義した関数を使って、Date 型の変数から、フォーマットされた文字列を取得できます。&lt;br&gt;&lt;br&gt;date.toString(format: &quot;yyyy-MM-dd HH:mm:ss&quot;)&lt;br&gt;&lt;br&gt;以下のコードを実行してみます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;extension Date {&lt;br&gt;    func toString(format: String) -&gt; String {&lt;br&gt;        let df = DateFormatter()&lt;br&gt;        df.dateFormat = format&lt;br&gt;        return df.string(from: self)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let date = Date()&lt;br&gt;let dateStr = date.toString(format: &quot;yyyy-MM-dd HH:mm:ss&quot;)&lt;br&gt;&lt;br&gt;print(dateStr)&lt;br&gt;&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;2023-08-16 20:25:26&lt;br&gt;Swift の Extension 2&lt;br&gt;&lt;br&gt;&lt;br&gt;extension で定義した関数を使って、Date 型の変数からフォーマットした文字列が取得できていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Extension についてご説明しました。</description><pubDate>Wed, 16 Aug 2023 21:43:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift のプロパティオブザーバー willSet・didSet</title><link>https://softmoco.com/swift-basics/swift-property-observers.php</link><description>Swift のプロパティオブザーバー willSet・didSet&lt;br&gt;&lt;br&gt;ここでは Swift のプロパティオブザーバーについてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift のプロパティオブザーバーの基本&lt;br&gt;Swift のプロパティオブザーバーを使う&lt;br&gt;Swift のプロパティオブザーバーの基本&lt;br&gt;Swift のプロパティオブザーバーを使うと、プロパティの値がセットされるたびに実行されるコードを指定することができます。&lt;br&gt;&lt;br&gt;プロパティオブザーバーには willSet と didSet の二種類があります。&lt;br&gt;&lt;br&gt;willSet はプロパティの値が変更される直前に呼ばれます。&lt;br&gt;&lt;br&gt;didSet はプロパティの値が変更された直後に呼ばれます。&lt;br&gt;&lt;br&gt;&lt;br&gt;willSet と didSet の基本的な構文は以下の通りです。&lt;br&gt;&lt;br&gt;&lt;br&gt;var [プロパティ名]: [データ型] = [デフォルト値] {&lt;br&gt;    willSet {&lt;br&gt;        [プロパティの値が変更される直前に実行されるステートメント]&lt;br&gt;    }&lt;br&gt;    didSet {&lt;br&gt;        [プロパティの値が変更された直後に実行されるステートメント]&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;willSet の中で、これから変更される値を使いたい時には newValue でアクセスできます。&lt;br&gt;&lt;br&gt;もしくは willSet(newValueに代わるパラメタ名) { ... } のようにパラメタ名を指定して、その名前でアクセスすることもできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;didSet の中で、変更前の値を使いたい時には oldValue でアクセスできます。&lt;br&gt;&lt;br&gt;もしくは、willSet(oldValueに代わるパラメタ名) { ... } のようにパラメタ名を指定して、その名前でアクセスすることもできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、プロパティオブザーバーは、プロパティに同じ値がセットされた時にも実行されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift のプロパティオブザーバーを使う&lt;br&gt;それでは、Swift のプロパティオブザーバーを使って、プロパティに値がセットされた時にコードを実行してみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような TestClass を定義します。&lt;br&gt;&lt;br&gt;class TestClass {&lt;br&gt;    var count: Int = 0 {&lt;br&gt;        willSet {&lt;br&gt;            print(&quot;count は \(newValue) になります。&quot;)&lt;br&gt;        }&lt;br&gt;        didSet {&lt;br&gt;            print(&quot;変更前: \(oldValue) -&gt; 変更後: \(self.count)&quot;)&lt;br&gt;            if oldValue == self.count {&lt;br&gt;                print(&quot;count は変更なしです。&quot;)&lt;br&gt;            } else if oldValue &lt; self.count {&lt;br&gt;                print(&quot;count が \(self.count - oldValue) 増えました。&quot;)&lt;br&gt;            } else {&lt;br&gt;                print(&quot;count が \(oldValue - self.count) 減りました。&quot;)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;count という整数型のプロパティを初期値 0 で定義します。&lt;br&gt;&lt;br&gt;willSet で、count の値が変更される前に &quot; count は \(newValue) になります。&quot; を print してします。&lt;br&gt;&lt;br&gt;didSet で、count の変更後に、変更前と変更後の値と、count がどのように変更されたかを print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;testClass のインスタンスを作って、count に値を代入し、print される文字列を確認してみます。&lt;br&gt;&lt;br&gt;let testClass = TestClass()&lt;br&gt;testClass.count = 5&lt;br&gt;print(&quot;-----&quot;)&lt;br&gt;testClass.count = 20&lt;br&gt;print(&quot;-----&quot;)&lt;br&gt;testClass.count = 20&lt;br&gt;print(&quot;-----&quot;)&lt;br&gt;testClass.count = 8&lt;br&gt;&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;count は 5 になります。&lt;br&gt;変更前: 0 -&gt; 変更後: 5&lt;br&gt;count が 5 増えました。&lt;br&gt;-----&lt;br&gt;count は 20 になります。&lt;br&gt;変更前: 5 -&gt; 変更後: 20&lt;br&gt;count が 15 増えました。&lt;br&gt;-----&lt;br&gt;count は 20 になります。&lt;br&gt;変更前: 20 -&gt; 変更後: 20&lt;br&gt;count は変更なしです。&lt;br&gt;-----&lt;br&gt;count は 8 になります。&lt;br&gt;変更前: 20 -&gt; 変更後: 8&lt;br&gt;count が 12 減りました。&lt;br&gt;Swift のプロパティオブザーバー willSet・didSet 1&lt;br&gt;&lt;br&gt;count プロパティに値が代入される度に、willSet と didSet が呼ばれているのがわかります。&lt;br&gt;&lt;br&gt;変更前と変更後が同じ値の時も実行されていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift のプロパティオブザーバーについてご説明しました。</description><pubDate>Fri, 11 Aug 2023 20:16:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の defer 文</title><link>https://softmoco.com/swift-basics/swift-defer.php</link><description>Swift の defer 文&lt;br&gt;&lt;br&gt;ここでは Swift の defer 文 についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の defer 文の基本&lt;br&gt;defer 文内の変数について&lt;br&gt;複数の defer 文があるケース&lt;br&gt;do 文と合わせて defer 文を使う&lt;br&gt;Swift の defer 文の基本&lt;br&gt;Swift の defer 文を使うと、スコープを抜ける時に、指定したステートメントを実行することができます。&lt;br&gt;&lt;br&gt;どんな状態でスコープを抜けても実行されるので、スコープ内で予期せぬエラーが起きた時の後処理にも使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の defer 文の構文は次の通りです。&lt;br&gt;&lt;br&gt;defer {&lt;br&gt;    [ステートメント]&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;br&gt;次の defer 文を実行してみます。&lt;br&gt;&lt;br&gt;func testFunction1() {&lt;br&gt;    print(&quot;Statement 1&quot;)&lt;br&gt;&lt;br&gt;    defer {&lt;br&gt;        print(&quot;Defer 1&quot;)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    print(&quot;Statement 2&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;testFunction1()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Statement 1&lt;br&gt;Statement 2&lt;br&gt;Defer 1&lt;br&gt;Swift の defer 文 1&lt;br&gt;&lt;br&gt;print 文が Statement 1 -&gt; Statement 2 -&gt; Defer 1 の順番で実行されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;defer 文内の変数について&lt;br&gt;defer 文内で使用されている変数の値などは、defer 文が実行される時点のものになります。&lt;br&gt;&lt;br&gt;value という名前の変数に値を代入して defer 文内のステートメントで print してみます。&lt;br&gt;&lt;br&gt;func testFunction2() {&lt;br&gt;    var value = 1&lt;br&gt;    print(&quot;Statement 1 - value: \(value)&quot;)&lt;br&gt;&lt;br&gt;    defer {&lt;br&gt;        print(&quot;Defer 1 - value: \(value)&quot;)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    value = 2&lt;br&gt;    print(&quot;Statement 2 - value: \(value)&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;testFunction2()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Statement 1 - value: 1&lt;br&gt;Statement 2 - value: 2&lt;br&gt;Defer 1 - value: 2&lt;br&gt;Swift の defer 文 2&lt;br&gt;&lt;br&gt;Defer 1 に続く value の値が 1 ではなく、2 になっていることがわかります。&lt;br&gt;&lt;br&gt;&lt;br&gt;複数の defer 文があるケース&lt;br&gt;defer 文が複数ある時は、先に定義されたものが後になるように反対の順番で実行されます。&lt;br&gt;&lt;br&gt;func testFunction3() {&lt;br&gt;    print(&quot;Statement 1&quot;)&lt;br&gt;&lt;br&gt;    defer {&lt;br&gt;        print(&quot;Defer 1&quot;)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    defer {&lt;br&gt;        print(&quot;Defer 2&quot;)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    defer {&lt;br&gt;        print(&quot;Defer 3&quot;)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    print(&quot;Statement 2&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;testFunction3()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Statement 1&lt;br&gt;Statement 2&lt;br&gt;Defer 3&lt;br&gt;Defer 2&lt;br&gt;Defer 1&lt;br&gt;Swift の defer 文 3&lt;br&gt;&lt;br&gt;Defer 文が 3 -&gt; 2 -&gt; 1 の順番で実行されていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;do 文と合わせて defer 文を使う&lt;br&gt;do 文と合わせて使うことでスコープを作って、do 文のスコープを抜ける時に defer 文を実行することもできます。&lt;br&gt;&lt;br&gt;func testFunction4() {&lt;br&gt;    &lt;br&gt;    print(&quot;Statement 1&quot;)&lt;br&gt;    &lt;br&gt;    do {&lt;br&gt;        print(&quot;Statement 2&quot;)&lt;br&gt;        defer {&lt;br&gt;            print(&quot;Defer 1&quot;)&lt;br&gt;        }&lt;br&gt;        print(&quot;Statement 3&quot;)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    print(&quot;Statement 4&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;testFunction4()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Statement 1&lt;br&gt;Statement 2&lt;br&gt;Statement 3&lt;br&gt;Defer 1&lt;br&gt;Statement 4&lt;br&gt;Swift の defer 文 4&lt;br&gt;&lt;br&gt;Statement 1 の print 文が実行され、do 文内 print 文が Statement 2 -&gt; Statement 3 -&gt; Defer 1 の順番で実行されて、その後、外のスコープの Statement 4 の print 文が実行されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の defer 文 についてご説明しました。</description><pubDate>Thu, 10 Aug 2023 19:34:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift のデータ型の確認と変換 - is / as 演算子</title><link>https://softmoco.com/swift-basics/swift-type-casting.php</link><description>Swift のデータ型の確認と変換 - is / as 演算子&lt;br&gt;&lt;br&gt;ここでは Swift の is と as 演算子を使って、データ型の確認・変換する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift で is 演算子を使ってデータ型を確認する&lt;br&gt;Swift で as 演算子を使ってデータ型を変換する&lt;br&gt;Swift で is 演算子を使ってデータ型を確認する&lt;br&gt;Swift でデータ型を確認するには is 演算子が使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、以下のような Any 型の value という変数に入っている値のデータ型が、String か確認したい時は次のようにできます。&lt;br&gt;&lt;br&gt;let value : Any = &quot;test&quot;&lt;br&gt;&lt;br&gt;if value is String {&lt;br&gt;    print(&quot;value is String&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;value is not String&quot;)&lt;br&gt;}&lt;br&gt;これを実行すると value に入っている値は文字列なので value is String と表示されます。&lt;br&gt;&lt;br&gt;Swift のデータ型の確認と変換 - is / as 演算子 1&lt;br&gt;&lt;br&gt;&lt;br&gt;value に整数の値を代入して実行してみます。&lt;br&gt;&lt;br&gt;let value : Any = 1&lt;br&gt;&lt;br&gt;if value is String {&lt;br&gt;    print(&quot;value is String&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;value is not String&quot;)&lt;br&gt;}&lt;br&gt;これを実行すると value に入っている値は整数なので value is not String と表示されます。&lt;br&gt;&lt;br&gt;Swift のデータ型の確認と変換 - is / as 演算子 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で as 演算子を使ってデータ型を変換する&lt;br&gt;Swift でデータ型を変換するには as 演算子が使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;as? 演算子では、タイプを確認して、オプショナルのデータ型に変換します。&lt;br&gt;&lt;br&gt;変換できない場合は nil になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以下のような value 変数を as? を使ってキャストして、データ型を確認してみます。&lt;br&gt;&lt;br&gt;let value : Any = &quot;test&quot;&lt;br&gt;&lt;br&gt;let val1 = value as? String&lt;br&gt;print(type(of: val1))&lt;br&gt;&lt;br&gt;let val2 = value as? Int&lt;br&gt;print(type(of: val2))&lt;br&gt;&lt;br&gt;これを実行すると次のようになります。&lt;br&gt;&lt;br&gt;Swift のデータ型の確認と変換 - is / as 演算子 3&lt;br&gt;&lt;br&gt;val1 は test という値の入ったオプショナルの String に変換されています。&lt;br&gt;&lt;br&gt;test を整数に変換できないので、val2 の値は nil になり、データ型はオプショナルの Int になっているのがわかります。&lt;br&gt;&lt;br&gt;&lt;br&gt;as! 演算子は as? と同じ使い方で使えますが、オプショナルではないデータ型に変換します。&lt;br&gt;&lt;br&gt;let value : Any = &quot;test&quot;&lt;br&gt;&lt;br&gt;let val1 = value as! String&lt;br&gt;print(type(of: val1))&lt;br&gt;Swift のデータ型の確認と変換 - is / as 演算子 4&lt;br&gt;&lt;br&gt;&lt;br&gt;変換に失敗した時は、プログラムがクラッシュしてしまうのでお気をつけください。&lt;br&gt;&lt;br&gt;絶対に変換が成功するとわかっているような状況で、オプショナルでないデータ型に変換したい時にのみ使います。&lt;br&gt;&lt;br&gt;let value : Any = &quot;test&quot;&lt;br&gt;&lt;br&gt;let val2 = value as! Int&lt;br&gt;print(type(of: val2))&lt;br&gt;Swift のデータ型の確認と変換 - is / as 演算子 5&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の is と as 演算子を使って、データ型の確認・変換する方法をご説明しました。</description><pubDate>Tue, 08 Aug 2023 22:13:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift で stride() を使って for ループする</title><link>https://softmoco.com/swift/swift-for-stride.php</link><description>Swift でコードを繰り返し実行する（ループする）には、for-in・while・repeat-while 文が使えます。&lt;br&gt;&lt;br&gt;Swift の基本的な for-in 文の使い方については「Swift の for ループ」でご説明しました。&lt;br&gt;&lt;br&gt;&lt;br&gt;for-in 文で数値の範囲を指定してループするには、... などの範囲演算子を使います。&lt;br&gt;&lt;br&gt;例えば、1 ~ 5 までループしたい時は次のような感じでループできます。&lt;br&gt;&lt;br&gt;for i in 1...5 {&lt;br&gt;    print(&quot;i = \(i)&quot;)&lt;br&gt;}&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;i = 1&lt;br&gt;i = 2&lt;br&gt;i = 3&lt;br&gt;i = 4&lt;br&gt;i = 5&lt;br&gt;Swift で stride() を使って for ループする 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この方法では、ループするたびに i が 1 ずつ増えましたが、stride() 関数を使うと、もっとループの制御をすることができます。&lt;br&gt;&lt;br&gt;stride() 関数の構文は二つあって、ひとつめの stride(from:to:by:) は次のように使えます。&lt;br&gt;&lt;br&gt;for 変数 in stride(from: スタート値, to: エンド値, by: ステップ量) {&lt;br&gt;    // 反復するコード&lt;br&gt;}&lt;br&gt;from のスタート値はループで実行される最初の値です。&lt;br&gt;&lt;br&gt;to のエンド値の直前までループしますが、エンド値はループに含まれません。&lt;br&gt;&lt;br&gt;by のステップ量は、ループする際に加算されていく値です。マイナスの値が設定された時はループするたびに値が小さくなっていきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;from と by の値によりますが、ループしてちょうど値がエンド値になる場合は、エンド値も含んでループしたい時は stride(from:through:by:) を使います。&lt;br&gt;&lt;br&gt;for 変数 in stride(from: スタート値, through: エンド値, by: ステップ量) {&lt;br&gt;    // 反復するコード&lt;br&gt;}&lt;br&gt;エンド値の扱い方以外は stride(from:to:by:) と同じです。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、stride() 関数を使って、0 から 5 未満を 0.5 のステップ量でループしたい時は次のようにできます。&lt;br&gt;&lt;br&gt;for i in stride(from: 0, to: 5, by: 0.5) {&lt;br&gt;    print(&quot;i = \(i)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。0 から 0.5 ずつ増えながら print 文が 10 回実行されています。&lt;br&gt;&lt;br&gt;i が 5 になった時は実行されずにループを抜けているのがわかります。&lt;br&gt;&lt;br&gt;i = 0.0&lt;br&gt;i = 0.5&lt;br&gt;i = 1.0&lt;br&gt;i = 1.5&lt;br&gt;i = 2.0&lt;br&gt;i = 2.5&lt;br&gt;i = 3.0&lt;br&gt;i = 3.5&lt;br&gt;i = 4.0&lt;br&gt;i = 4.5&lt;br&gt;Swift で stride() を使って for ループする 2&lt;br&gt;&lt;br&gt;&lt;br&gt;5 まで含めてループしたい時は to を through に変更します。&lt;br&gt;&lt;br&gt;for i in stride(from: 0, through: 5, by: 0.5) {&lt;br&gt;    print(&quot;i = \(i)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。i = 5 の時も実行されていますね。&lt;br&gt;&lt;br&gt;i = 0.0&lt;br&gt;i = 0.5&lt;br&gt;i = 1.0&lt;br&gt;i = 1.5&lt;br&gt;i = 2.0&lt;br&gt;i = 2.5&lt;br&gt;i = 3.0&lt;br&gt;i = 3.5&lt;br&gt;i = 4.0&lt;br&gt;i = 4.5&lt;br&gt;i = 5.0&lt;br&gt;Swift で stride() を使って for ループする 3&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で stride() を使って for ループする方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Mon, 07 Aug 2023 19:33:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>WeatherKit を使って天気情報を取得する方法 (Swift)</title><link>https://softmoco.com/basics/how-to-use-weatherkit.php</link><description>WeatherKit を使って天気情報を取得する方法 (Swift)&lt;br&gt;&lt;br&gt;ここでは、iOS アプリで WeatherKit を使って天気情報を取得する方法をご説明します。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 1-1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;WeatherKit について&lt;br&gt;WeatherKit を使って天気情報を取得する方法&lt;br&gt;WeatherKit サービスを追加した App ID を生成する&lt;br&gt;WeatherKit を使う iOS アプリの準備をする&lt;br&gt;WeatherKit を使って天気情報を取得する&lt;br&gt;WeatherKit について&lt;br&gt;WeatherKit は Apple の提供しているフレームワークのひとつで、Apple Weather サービスから天気の情報取得することができます。&lt;br&gt;&lt;br&gt;WeatherKit を使うには、有料の Apple Developer Program に登録する必要があります。&lt;br&gt;&lt;br&gt;詳しくは「Apple Developer Program について」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、WeatherKit を使うには、iOS 16, iPadOS 16, macOS 13, tvOS 16, watchOS が必要です。&lt;br&gt;&lt;br&gt;ここでは、iPhone 用のテストアプリを作るので iOS 16 で開発します。&lt;br&gt;&lt;br&gt;ウエブアプリやアンドロイドなど、WeatherKit が使えない他のプラットフォーム用に REST API も提供されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;WeatherKit は 1 ヶ月 500,000 API コールまでは Apple Developer Program に含まれていて無料ですが、リクエストがそれより多くなる場合は有料になります。&lt;br&gt;&lt;br&gt;料金の詳細は Apple の WeatherKit のページでご確認ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法&lt;br&gt;WeatherKit を使って天気情報を取得するには、WeatherKit サービスを追加した App ID を生成し、iOS アプリに Capability を追加する必要がありますので、その方法を順を追ってご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;WeatherKit サービスを追加した App ID を生成する&lt;br&gt;WeatherKit サービスを追加した App ID を生成するのに、Bundle Identifier が必要になります。&lt;br&gt;&lt;br&gt;Bundle Identifier (Bundle ID) は Apple がアプリを特定するのに使う、アプリの ID です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Bundle Identifier はユニークでなくてはならず、リバースドメインスタイル (com.domainname.appname) が推奨されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;先に、WeatherKit を使う iOS アプリの Bundle Identifier を設定しておきます。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;左側のナビゲーターエリアの上のプロジェクト名をクリックし、TARGETS のプロジェクト名をクリックし、Signing &amp; Capabilities タブをクリックします。&lt;br&gt;&lt;br&gt;ここでは Bundle Identifier を「com.softmoco.WeatherKitTest」に設定しました。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 1-2&lt;br&gt;&lt;br&gt;&lt;br&gt;続いて、Apple Developer で WeatherKit を使いたい iOS アプリの App ID を生成します。&lt;br&gt;&lt;br&gt;Apple Developer のサイトにログインし、Certificates, Identifiers &amp; Profiles の Identifiers をクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Identifiers の横の + ボタンをクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;[App IDs] を選択し、[Continue] をクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;[App] を選択し、[Continue] をクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;[Description] にはお好きな名前を、[Bundle ID] は Explicit で Xcode で指定したものと同じものを入力します。&lt;br&gt;&lt;br&gt;下の App Services で WeatherKit を選択して、[Continue] をクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;確認画面が出てくるので、確認して、よければ [Register] をクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、iOS アプリの WeatherKit サービスを使う App ID が登録できました。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;WeatherKit を使う iOS アプリの準備をする&lt;br&gt;WeatherKit を使って天気情報を取得して、表示する簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;まずは、iOS アプリに WeatherKit の Capability を追加します。&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほど新規作成して Bundle Identifier を設定したプロジェクトを Xcode で開きます。&lt;br&gt;&lt;br&gt;左側のナビゲーターエリアの上のプロジェクト名を選択し、TARGETS のプロジェクト名を選択します。&lt;br&gt;&lt;br&gt;そして、Signing &amp; Capabilities タブの + Capability をクリックします。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;Capability のリストから WeatherKit を探し、ダブルクリックして追加します。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、WeatherKit の Capability が追加できました。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、天気情報を表示する画面を作ります。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Location、Temperature 用の Label と、お天気シンボル用の Image View をひとつと、Condition 用の Label をひとつ追加します。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController.swift をアシスタントエディタで開き、Label と Image View のアウトレットを以下の名前で作っておきます。&lt;br&gt;&lt;br&gt;オブジェクトの追加の方法や、アウトレットの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var locationLabel: UILabel!&lt;br&gt;    @IBOutlet weak var temperatureLabel: UILabel!&lt;br&gt;    @IBOutlet weak var conditionLabel: UILabel!&lt;br&gt;    @IBOutlet weak var symbolImageView: UIImageView!&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する&lt;br&gt;それでは、iOS アプリで Swift で WeatherKit を使って天気情報を取得するコードを書いていきましょう。&lt;br&gt;&lt;br&gt;今回は Los Angeles の LAX（ロサンゼルス国際空港）の天気情報を取得してみます。&lt;br&gt;&lt;br&gt;緯度と経度は latitude: 33.942791 と longitude: -118.410042 です。&lt;br&gt;&lt;br&gt;現在地の天気を取得したい場合は「iOS アプリで現在地情報を取得する方法」をご参考に現在地のロケーションを取得してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;WeatherKit を使ってロサンゼルスの天気情報を取得して表示するサンプルコードは以下の通りです。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import CoreLocation&lt;br&gt;import WeatherKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    let weatherService = WeatherService()&lt;br&gt;&lt;br&gt;    @IBOutlet weak var locationLabel: UILabel!&lt;br&gt;    @IBOutlet weak var temperatureLabel: UILabel!&lt;br&gt;    @IBOutlet weak var conditionLabel: UILabel!&lt;br&gt;    @IBOutlet weak var symbolImageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        temperatureLabel.text = &quot;&quot;&lt;br&gt;        conditionLabel.text = &quot;&quot;&lt;br&gt;        &lt;br&gt;        locationLabel.text = &quot;Los Angeles, CA&quot;&lt;br&gt;        let loc = CLLocation(latitude:33.942791, longitude: -118.410042)&lt;br&gt;        &lt;br&gt;        Task {&lt;br&gt;            let weather = try? await weatherService.weather(for: loc)&lt;br&gt;            if let weather = weather {&lt;br&gt;                let tempF = weather.currentWeather.temperature&lt;br&gt;                let tempC = tempF.converted(to: .celsius)&lt;br&gt;                temperatureLabel.text = &quot;\(tempF.formatted()) / \(tempC.formatted(.measurement(usage: .asProvided)))&quot;&lt;br&gt;                &lt;br&gt;                conditionLabel.text = weather.currentWeather.condition.rawValue&lt;br&gt;                symbolImageView.image = UIImage(systemName: weather.currentWeather.symbolName)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;WeatherKit を使って天気情報を取得する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;2 ~ 3 行目では、CLLocation と WeatherKit を使うので、CoreLocation と WeatherKit を import しています。&lt;br&gt;&lt;br&gt;7 行目では、WeatherService オブジェクトを生成しています。&lt;br&gt;&lt;br&gt;20 行目で Location ラベルに Los Angeles, CA と設定して、緯度・経度から CLLocation オブジェクトを生成しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;24 行目でロケーションを指定して WeatherService から天気情報を取得しています。&lt;br&gt;&lt;br&gt;今回は CurrentWeather を使いますが、その他にも 日ごと(dailyForecast)、時間ごと(hourlyForecast)、分ごと(minuteForecast) の天気予報の情報なども取得できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;戻り値の weather が nil でない場合は 26 行目で現在の気温を取得しています。&lt;br&gt;&lt;br&gt;formatted() 関数はデフォルトのフォーマットスタイルを使って、気温を文字列にフォーマットして変換します。&lt;br&gt;&lt;br&gt;私の環境ではロケールが en_US なので、 デフォルトの F にフォーマットされます。&lt;br&gt;&lt;br&gt;27 行目では気温を摂氏に変換して、28 行目で temperatureLabel に華氏と摂氏の温度を表示するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;30 行目では、currentWeather.condition に設定されている WeatherCondition の Enum の rawValue を conditionLabel.text に代入しています。&lt;br&gt;&lt;br&gt;31 行目では、currentWeather.symbolName に設定されているシンボル名から UIImage オブジェクトを生成し、symbolImageView に表示するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これをビルドしてシミュレーターにインストールして実行すると次のように現在の天気が取得され画面に表示されます。&lt;br&gt;&lt;br&gt;WeatherKit を使って天気情報を取得する方法 1-1&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iOS アプリで WeatherKit を使って天気情報を取得する方法をご説明しました。</description><pubDate>Sat, 22 Jul 2023 09:07:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift で iOS アプリのバージョンとビルド番号を取得する方法</title><link>https://softmoco.com/basics/how-to-get-app-version-build-numbers-with-swift.php</link><description>Swift で iOS アプリのバージョンとビルド番号を取得する方法&lt;br&gt;&lt;br&gt;iOS のアプリ内で、アプリのバージョンやビルド番号を表示したい時ありますよね。&lt;br&gt;&lt;br&gt;ここでは、Swift で iOS アプリのバージョンとビルド番号を取得する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Xcode で iOS アプリのバージョンとビルド番号を確認する&lt;br&gt;Swift で iOS アプリのバージョンとビルド番号を取得する&lt;br&gt;Xcode で iOS アプリのバージョンとビルド番号を確認する&lt;br&gt;まずは、Xcode で iOS アプリのバージョンとビルド番号を確認しておきます。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリのプロジェクトを開きます。&lt;br&gt;&lt;br&gt;左側のナビゲーターエリアの上のプロジェクト名をクリックし、TARGETS のプロジェクト名をクリックし、General タブをクリックします。&lt;br&gt;&lt;br&gt;Identity セクションの Bundle Identifier の下にアプリの Version と Build が表示されていて、ここで変更が可能です。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は、新規 iOS アプリを作成し、テストのために、Version を 1.2、Build を 3 に変更しました。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で iOS アプリのバージョンとビルド番号を取得する&lt;br&gt;Swift で iOS アプリのバージョンとビルド番号を取得する方法を二つご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;ひとつ目は Bundle クラスの main バンドルの object(forInfoDictionaryKey key: String) メソッドを使って取得する方法です。&lt;br&gt;&lt;br&gt;このメソッドを使うと、information property list の値をキーを指定して取得することができます。&lt;br&gt;&lt;br&gt;Version のキーは CFBundleShortVersionString で、Build のキーは CFBundleVersion です。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは実際に、object(forInfoDictionaryKey key: String) メソッドを使って、iOS アプリのバージョンとビルド番号を取得して print してみます。&lt;br&gt;&lt;br&gt;ViewController.swift に次のコードを追加します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        let version = getInfoDictionary(&quot;CFBundleShortVersionString&quot;)&lt;br&gt;        let build = getInfoDictionary(&quot;CFBundleVersion&quot;)   &lt;br&gt;        print(&quot;Version: \(version), Build: \(build)&quot;)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func getInfoDictionary (_ key: String) -&gt; String {&lt;br&gt;        if let version = Bundle.main.object(forInfoDictionaryKey: key) as? String {&lt;br&gt;            return version&lt;br&gt;        } else {&lt;br&gt;            return &quot;&quot;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;getInfoDictionary() 関数は、キーを渡して、information property list の値を返す関数です。&lt;br&gt;&lt;br&gt;14 行目が Bundle クラスの main バンドルの object(forInfoDictionaryKey key: String) メソッドを使って、値を取得している箇所です。&lt;br&gt;&lt;br&gt;object(forInfoDictionaryKey key: String) メソッドの返り値は Any? 型なので、文字列に変換しています。&lt;br&gt;&lt;br&gt;結果が nil じゃない時は取得した値を、nil の時は空の文字列を return しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;8 行目で、getInfoDictionary() に CFBundleShortVersionString を渡して version の値を取得しています。&lt;br&gt;&lt;br&gt;9 行目で、getInfoDictionary() に CFBundleVersion を渡して build の値を取得しています。&lt;br&gt;&lt;br&gt;10 行目で取得した version と build の値を print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これをシミュレーターを指定して実行すると output 画面に Version: 1.2, Build: 3 と表示されます。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;二つ目の方法は Bundle クラスの main バンドルの infoDictionary プロパティを使って取得する方法です。&lt;br&gt;&lt;br&gt;Bundle.main.infoDictionary?[key] や Bundle.main.infoDictionary![key] のようにして、information property list の値をキーを指定して取得することができます。&lt;br&gt;&lt;br&gt;Version と Build 番号を取得するキーは、先ほどと同じ CFBundleShortVersionString と CFBundleVersion です。&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほどの ViewController.swift のコードの 14 行目を次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        let version = getInfoDictionary(&quot;CFBundleShortVersionString&quot;)&lt;br&gt;        let build = getInfoDictionary(&quot;CFBundleVersion&quot;)   &lt;br&gt;        print(&quot;Version: \(version), Build: \(build)&quot;)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func getInfoDictionary (_ key: String) -&gt; String {&lt;br&gt;        if let version = Bundle.main.infoDictionary?[key] as? String {&lt;br&gt;            return version&lt;br&gt;        } else {&lt;br&gt;            return &quot;&quot;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;14 行目で Bundle クラスの main バンドルの infoDictionary プロパティで、information property list の値を取得しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これをシミュレーターを指定して実行すると、先ほどと同様に output 画面に Version: 1.2, Build: 3 と表示されます。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;今回はバンドルの iOS アプリの Version と Build 番号を取得しましたが、同様の方法で、Info.plist に設定した値を、キーを指定して取得することも可能です。&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリのバージョンとビルド番号を取得する方法をご説明しました。</description><pubDate>Fri, 14 Jul 2023 21:59:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリ - Push Notification（プッシュ通知）を実装する方法 (Swift)</title><link>https://softmoco.com/basics/ios-push-notifications.php</link><description>ここでは、iOS アプリで Push Notification（プッシュ通知）を実装する方法をご説明します。&lt;br&gt;&lt;br&gt; iOS アプリで Push Notification（プッシュ通知）を実装するには、有料の Apple Developer Program に登録する必要があります。詳しくは「Apple Developer Program について」をご覧ください。&lt;br&gt;&lt;br&gt;それでは、iOS アプリで Push Notification（プッシュ通知）を実装する方法を順を追ってご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;iOS アプリで Push Notification（プッシュ通知）について&lt;br&gt;Push Notification（プッシュ通知）の App ID を生成する方法&lt;br&gt;Xcode で Bundle Identifier を設定する&lt;br&gt;Apple Developer で iOS アプリの App ID を生成する&lt;br&gt;Apple Push Notification service 証明書を生成する&lt;br&gt;Mac で CSR (Certificate Signing Request) を生成する&lt;br&gt;Apple Push Notification service 証明書を生成する&lt;br&gt;Mac に Apple Push Notification service 証明書をインストールする&lt;br&gt;Push Notification（プッシュ通知）を受信する iOS アプリを作る&lt;br&gt;Xcode で Push Notifications の Capability を追加する&lt;br&gt;iOS アプリで Push Notification を受信する方法&lt;br&gt;iOS アプリを iPhone にインストールして通知を許可し、デバイストークンを取得する&lt;br&gt;curl を使って Push Notification（プッシュ通知）を送信する&lt;br&gt;証明書から p12 ファイルをエクスポートし pem ファイルに変換する&lt;br&gt;curl を使って Push Notification（プッシュ通知）を送信する&lt;br&gt;Node.js を使って Push Notification（プッシュ通知）を送信する&lt;br&gt;&lt;br&gt;iOS アプリで Push Notification（プッシュ通知）について&lt;br&gt;Push Notification（プッシュ通知）を実装すると、サーバから iOS のデバイスに通知を表示することができます。&lt;br&gt;&lt;br&gt;Push Notification（プッシュ通知）は次の順番で送られます。&lt;br&gt;&lt;br&gt;Provider server から Apple Push Notification service (APNs) にプッシュ通知のリクエストを post する。&lt;br&gt;Apple Push Notification service (APNs) がユーザーの iOS デバイスにプッシュ通知を送る。&lt;br&gt;iOS デバイスでプッシュ通知を受信し、表示される。&lt;br&gt;&lt;br&gt;Provider server はこちらで準備するサーバで、Apple Push Notification service (APNs) は Apple のサービスです。&lt;br&gt;&lt;br&gt;Provider server からは、HTTP/2 と TLS 1.2 以降で APNs に接続して Post リクエストを送ります。&lt;br&gt;&lt;br&gt;Post するのに何を使って実装しても良いですが、ここではテストのために開発用の Mac のコマンドラインから curl を使って APNs に post する方法と、Node.js で実装する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;このサイトでは、Push Notification（プッシュ通知）を実装するのに必要な App ID や証明書の生成方法、通知を受信する iOS アプリの作り方をご説明します。&lt;br&gt;&lt;br&gt;Apple Developer のサイトや Xcode の UI は変わっていくかもしれませんが、基本的な手順は変わらないと思います。ご参考になれば幸いです。</description><pubDate>Fri, 16 Jun 2023 10:01:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法</title><link>https://softmoco.com/devenv/how-to-enable-developer-mode-iphone.php</link><description>iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法&lt;br&gt;&lt;br&gt;iOS 16 から、Developer Mode（デベロッパモード）が導入されました。&lt;br&gt;&lt;br&gt;Developer Mode を有効にしないと Xcode から開発したアプリをデバイスにインストールできません。&lt;br&gt;&lt;br&gt;デバイスをつないでも、以下のように (Developer mode disabled) と表示され、インストールしようとすると警告メッセージが表示されインストールできません。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Developer Mode（デベロッパモード） を有効にするには、設定 (Settings) アプリを開き、プライバシーとセキュリティ (Privacy &amp; Security) 画面を開きます。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;下のほうのセキュリティのセクションにある デベロッパモード (Developer Mode) を選択します。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;デベロッパモード (Developer Mode) を ON にします。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;デバイスの再起動が必要なので、再起動します。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;再起動が終わると、以下のようなポップアップ画面が表示されるので、ディベロッパモードを オンにする を選択します。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;パスコードの入力を求められるので、パスコードを入力します。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;これで Developer Mode（デベロッパモード）が有効になりました。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で確認してみると、(Developer mode disabled) の表示がなくなり、Unavailable Device のセクションから iOS Device のセクションに変更されています。&lt;br&gt;&lt;br&gt;iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iPhone・iPad の Developer Mode（デベロッパモード）を有効にする方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Wed, 07 Jun 2023 19:09:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Swift で Face ID や Touch ID を使って認証する方法</title><link>https://softmoco.com/basics/how-to-implement-face-id-and-touch-id.php</link><description>Swift で Face ID や Touch ID を使って認証する方法&lt;br&gt;&lt;br&gt;ここでは、Swift で Face ID や Touch ID を使って認証する方法をご説明します。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Face ID・Touch ID を使う iOS アプリの準備をする&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法&lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;Face ID・Touch ID を使う iOS アプリの準備をする&lt;br&gt;まずはテスト用にボタンをタップして、Face ID・Touch ID で認証するための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Button をひとつ追加して、Title を Login with Face ID にしておきます。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;そのボタンから、loginButtonTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func loginButtonTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;ボタンの追加の方法や、アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法&lt;br&gt;今回は、Face ID や Touch ID で認証できない時は、パスコードでも認証できるようにします。&lt;br&gt;&lt;br&gt;最初に Face ID を使用するために、Privacy - Face ID Usage Description を info.plist に追加しておきます。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、iOS アプリで Swift で Face ID や Touch ID を使って認証するコードを書いていきましょう。&lt;br&gt;&lt;br&gt;LocalAuthentication framework を使うので、LocalAuthentication を import しておきます。&lt;br&gt;&lt;br&gt;そして、loginButtonTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import LocalAuthentication&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func loginButtonTapped(_ sender: Any) {&lt;br&gt;        let laContext = LAContext()&lt;br&gt;        var cepError:NSError?&lt;br&gt;&lt;br&gt;        if laContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &amp;cepError) {&lt;br&gt;&lt;br&gt;            let reason = &quot;Log in to your account&quot;&lt;br&gt;            laContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) {&lt;br&gt;                success, epError in&lt;br&gt;&lt;br&gt;                if success {&lt;br&gt;                    print(&quot;Success!&quot;)&lt;br&gt;                } else {&lt;br&gt;                    print(&quot;Error A: \(epError?.localizedDescription ?? &quot;Failed to evaluate policy&quot;)&quot;)&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;        } else {&lt;br&gt;            print(&quot;Error B: \(cepError?.localizedDescription ?? &quot;Can&#039;t evaluate policy&quot;)&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;loginButtonTapped() のコードをご説明します。&lt;br&gt;&lt;br&gt;11 行目で LAContext を定義します。 LAContext は Face ID や Touch ID を使って認証をハンドルするためのクラスです。&lt;br&gt;&lt;br&gt;12 行目では、エラーを受け取るための変数を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;14 行目で canEvaluatePolicy(_:error:)メソッドを使って、deviceOwnerAuthentication ポリシーで認証できるかをチェックしています&lt;br&gt;&lt;br&gt;Face ID や Touch ID で認証できない時はエラーにしたい時は deviceOwnerAuthenticationWithBiometrics ポリシーを指定してください。&lt;br&gt;&lt;br&gt;ポリシーが評価できる時は canEvaluatePolicy(_:error:)メソッドが true を返します。&lt;br&gt;&lt;br&gt;できない時は false を返し、cepError にエラーの内容が入ってくるので、27 行目でエラーを print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;続いて 17 行目で evaluatePolicy(_:localizedReason:reply:) メソッドを使って、deviceOwnerAuthentication ポリシーで、Face ID や Touch ID を使っての認証を評価しています。&lt;br&gt;&lt;br&gt;Face ID や Touch ID の認証が失敗した時やサポートされていない時はパスコードでの認証が可能です。&lt;br&gt;&lt;br&gt;Face ID や Touch ID の認証ができない時にエラーにしてしまいたい時は、deviceOwnerAuthenticationWithBiometrics ポリシーを指定してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;認証が成功すると success が true になるので、21 行目で Success! を print しています。&lt;br&gt;&lt;br&gt;ログインに使う時は、ログイン成功時の処理をここで行います。&lt;br&gt;&lt;br&gt;エラーの時は、epError にエラーの内容が入ってくるので、23 行目でエラーを print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証するコードは以上です。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;作ったアプリを iPhone や iPad にインストールしてテストします。&lt;br&gt;&lt;br&gt;作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;フェイス ID をサポートしている iPhone を指定してこのアプリを実行すると、以下のような画面が表示されます。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;Login with Face ID ボタンをタップすると、一度目は Face ID を使う許可を求めるダイアログが表示されるので、OK を選択します。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 7&lt;br&gt;&lt;br&gt;そうすると、フェイス ID の認証が実行され、認証に成功した時は Xcode の Output 画面に Success! と表示されます。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 1&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;エラーのケースですが、ユーザーが認証を途中でキャンセルした時は Error A: Authentication canceled. が print されました。&lt;br&gt;&lt;br&gt;canEvaluatePolicy に渡すポリシーを deviceOwnerAuthenticationWithBiometrics にして、Face ID を許可しないと Error B: Biometry is not available. が print されました。&lt;br&gt;&lt;br&gt;localizedDescription ではなく、エラーのコードでエラーの内容を判別したい時は LAError.Code のリファレンスを参照してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;この iOS アプリを、Face ID をサポートしておらず、Touch ID をサポートしているデバイスにインストールして実行すると、次のように Touch ID の認証が行われます。&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 9&lt;br&gt;&lt;br&gt;Swift で Face ID や Touch ID を使って認証する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で Face ID や Touch ID を使って認証する方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Tue, 06 Jun 2023 22:27:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリで QR コードとバーコードを生成する方法 (Swift)</title><link>https://softmoco.com/basics/how-to-generate-qr-code-and-barcode.php</link><description>iOS アプリで QR コードとバーコードを生成する方法 (Swift)&lt;br&gt;&lt;br&gt;ここでは、Swift で iOS アプリで、QR コードとバーコードを生成して表示する方法をご説明します。&lt;br&gt;&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;QR コードとバーコードを表示する iOS アプリの準備をする&lt;br&gt;Swift で QR コードを生成して表示する方法&lt;br&gt;Swift でバーコードを生成して表示する方法&lt;br&gt;QR コードとバーコードを表示する iOS アプリの準備をする&lt;br&gt;まずはテスト用にQR コードとバーコードを表示するための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Image View をひとつ追加します。&lt;br&gt;&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;その Image View から、codeImageView という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var codeImageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;ボタンの追加の方法や、アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で QR コードを生成して表示する方法&lt;br&gt;それでは、Swift で QR コードを生成して表示するコードを書いていきましょう。&lt;br&gt;&lt;br&gt;先ほど、作った ViewController.swift の viewDidLoad() を次のコードを追加します。&lt;br&gt;&lt;br&gt;override func viewDidLoad() {&lt;br&gt;    super.viewDidLoad()&lt;br&gt;    &lt;br&gt;    let codeValue = &quot;1234567890&quot;&lt;br&gt;    &lt;br&gt;    let codeData = codeValue.data(using: .ascii)&lt;br&gt;    if let ciFilter = CIFilter(name: &quot;CIQRCodeGenerator&quot;) {&lt;br&gt;        ciFilter.setValue(codeData, forKey: &quot;inputMessage&quot;)&lt;br&gt;        if let codeImage = ciFilter.outputImage  {&lt;br&gt;            codeImageView.image = UIImage(ciImage: codeImage)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;4 行目で codeValue として定義した文字列を QR コードとして表示します。&lt;br&gt;&lt;br&gt;6 行目では codeData に、codeValue を ascii のエンコーディングで Data 型に変換したオブジェクトを生成して代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;7 行目で、画像処理・生成するためのクラス CIFilter を生成しています。&lt;br&gt;&lt;br&gt;CIFilter のイニシャライザにフィルターの種類を指定します。&lt;br&gt;&lt;br&gt;今回は QRコードを生成するので CIQRCodeGenerator を指定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;CIFilter には Key Value ペアで必要な引数を指定します。&lt;br&gt;&lt;br&gt;CIQRCodeGenerator では、QR コードにエンコードされるデータは inputMessage というキーで指定します。&lt;br&gt;&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 5&lt;br&gt;&lt;br&gt;8 行目で先ほど生成した codeData を値として、inputMessage のキーで ciFilter にセットしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;9 行目で、CIFilter の outputImage プロパティから、処理後の CIImage オブジェクトを取得しています。&lt;br&gt;&lt;br&gt;10 行目で、codeImageView の image に生成された QR コードの画像を代入して表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、Swift で QR コードを生成して表示するコードが書けました。&lt;br&gt;&lt;br&gt;&lt;br&gt;このアプリをシミュレーターにインストールして実行すると、次のように QR コードが表示されます。&lt;br&gt;&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 6&lt;br&gt;&lt;br&gt;iPhone のカメラアプリなどで、この画像を見ると、1234567890 という値が表示されると思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でバーコードを生成して表示する方法&lt;br&gt;Swift でバーコードを生成して表示する方法は QR コードを生成するのとほぼ同じです。&lt;br&gt;&lt;br&gt;CIFilter のオブジェクトを生成する際に、CIQRCodeGenerator の代わりに CICode128BarcodeGenerator を指定します。&lt;br&gt;&lt;br&gt;CICode128BarcodeGenerator は CODE128 のバーコードを生成するためのフィルタです。&lt;br&gt;&lt;br&gt;CICode128BarcodeGenerator も処理対象となる画像を inputMessage というキーで指定することになっているので、先ほどのコードからフィルター名を置き換えるだけで、バーコードを生成するコードに変更することができます。&lt;br&gt;&lt;br&gt;override func viewDidLoad() {&lt;br&gt;    super.viewDidLoad()&lt;br&gt;    &lt;br&gt;    let codeValue = &quot;1234567890&quot;&lt;br&gt;    &lt;br&gt;    let codeData = codeValue.data(using: .ascii)&lt;br&gt;    if let ciFilter = CIFilter(name: &quot;CICode128BarcodeGenerator&quot;) {&lt;br&gt;        ciFilter.setValue(codeData, forKey: &quot;inputMessage&quot;)&lt;br&gt;        if let codeImage = ciFilter.outputImage  {&lt;br&gt;            codeImageView.image = UIImage(ciImage: codeImage)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;これをシミュレーターにインストールして実行すると、次のようにバーコードが生成され表示されます。&lt;br&gt;&lt;br&gt;iOS アプリで QR コードとバーコードを生成する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリで、QR コードとバーコードを生成して表示する方法をご説明しました。</description><pubDate>Fri, 26 May 2023 22:16:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法</title><link>https://softmoco.com/devenv/how-to-fix-untrusted-developer.php</link><description>iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法&lt;br&gt;&lt;br&gt;自分で開発したアプリを iPhone にインストールして実行しようとした時に、以下のような 信頼されていないデベロッパ (Untrusted Developer) のエラーが出て、インストールできないことがあります。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 1&lt;br&gt;&lt;br&gt;信頼されていないデベロッパ&lt;br&gt;この iPhone でデベロッパ &quot;Apple Development: ***** (***)&quot; の App を使用することは現在のデバイス管理設定では許可されていません。これらの App の使用は、&quot;設定&quot; で許可することがでいます。&lt;br&gt;&lt;br&gt;Untrusted Developer&lt;br&gt;Your device management settings do not allow using apps from developer &quot;Apple Development: ***** (***)&quot; on this iPhone. You can allow using these apps in Settings.&lt;br&gt;&lt;br&gt;&lt;br&gt;このエラーは、設定からデベロッパを信頼することで解決できます。&lt;br&gt;&lt;br&gt;設定アプリ で [一般] を開きます。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;[VPN とデバイス管理] を選択します。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;デベロッパAPP の箇所に信頼されていないデベロッパが表示されているので選択します。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;表示されているデベロッパを信頼をタップします。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;ポップアップメッセージが表示されるので、[信頼] をタップします。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、このデベロッパが信頼できたので、アプリをインストールして実行できるようになります。&lt;br&gt;&lt;br&gt;iOS 開発 - 信頼されていないデベロッパ (Untrusted Developer) の解決方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、信頼されていないデベロッパ (Untrusted Developer) の解決方法をご説明しました。</description><pubDate>Tue, 16 May 2023 19:30:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Swift - URLSession で HTTP リクエスト (GET) する方法 - Rest API・JSON</title><link>https://softmoco.com/basics/how-to-make-http-get-request.php</link><description>Swift - URLSession で HTTP リクエスト (GET) する方法 - Rest API・JSON&lt;br&gt;&lt;br&gt;ここでは、Swift で URLSession を使って、HTTP のリクエスト (GET) する方法をご説明します。&lt;br&gt;&lt;br&gt;カリフォルニア州の税率が取得できる CDTFA Tax Rate API を使って、税率を取得してみます。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;CDTFA Tax Rate API の説明&lt;br&gt;URLSession で HTTP リクエスト (GET) する方法&lt;br&gt;CDTFA Tax Rate API の説明&lt;br&gt;CDTFA Tax Rate API はカリフォルニア州が公開している、税率を取得できる API です。&lt;br&gt;&lt;br&gt;住所を指定して税率を取得する方法と、緯度・経度を指定して税率を取得する方法がありますが、今回は緯度・経度を指定して税率を取得します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Get Rate By Latitude and Longitude&lt;br&gt;&lt;br&gt;https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByLngLat?longitude={longitude}&amp;latitude={latitude}&lt;br&gt;&lt;br&gt;{longitude} に経度、{latitude} に緯度を指定して、上記の URL に GET リクエストをすると、以下のようなレスポンスが返ってきます。&lt;br&gt;&lt;br&gt;{&lt;br&gt;   &quot;taxRateInfo&quot;:[&lt;br&gt;      {&lt;br&gt;         &quot;rate&quot;:0.0775,&lt;br&gt;         &quot;jurisdiction&quot;:&quot;ANAHEIM&quot;,&lt;br&gt;         &quot;city&quot;:&quot;ANAHEIM&quot;,&lt;br&gt;         &quot;county&quot;:&quot;ORANGE&quot;,&lt;br&gt;         &quot;tac&quot;:&quot;300110370000&quot;&lt;br&gt;      }&lt;br&gt;   ],&lt;br&gt;   &quot;geocodeInfo&quot;:{&lt;br&gt;      &quot;bufferDistance&quot;:50&lt;br&gt;   },&lt;br&gt;   &quot;termsOfUse&quot;:&quot;https://www.cdtfa.ca.gov/dataportal/policy.htm&quot;,&lt;br&gt;   &quot;disclaimer&quot;:&quot;https://www.cdtfa.ca.gov/dataportal/disclaimer.htm&quot;&lt;br&gt;}&lt;br&gt;&lt;br&gt;URLSession で HTTP リクエスト (GET) する方法&lt;br&gt;それでは、Swift で URLSession を使って HTTP リクエスト (GET)する方法をご説明します。&lt;br&gt;&lt;br&gt;以前「iOS アプリで現在地情報を取得する方法 (Swift)」で緯度・経度を取得するアプリを作ったので、ここでは 緯度・経度 が取得できている前提で、緯度・経度をハードコードして、CDTFA Tax Rate API を使って、税率を取得します。&lt;br&gt;&lt;br&gt;ロサンゼルスにあるディズニーランドの緯度と経度を使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;GET リクエストをして、ディズニーランドあたりの税率を取得するコードは以下の通りです。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let longitude = -117.91966085189185&lt;br&gt;let latitude = 33.819508122999984&lt;br&gt;&lt;br&gt;let url = URL(string: &quot;https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByLngLat?longitude=\(longitude)&amp;latitude=\(latitude)&quot;)!&lt;br&gt;&lt;br&gt;var request = URLRequest(url: url)&lt;br&gt;request.httpMethod = &quot;GET&quot;&lt;br&gt;&lt;br&gt;URLSession.shared.dataTask(with: request) {(data, response, error) in&lt;br&gt;    &lt;br&gt;    if let error = error {&lt;br&gt;        print(&quot;Unexpected error: \(error.localizedDescription).&quot;)&lt;br&gt;        return;&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    if let response = response as? HTTPURLResponse {&lt;br&gt;        if !(200...299).contains(response.statusCode) {&lt;br&gt;            print(&quot;Request Failed - Status Code: \(response.statusCode).&quot;)&lt;br&gt;            return&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    if let data = data {&lt;br&gt;        do {&lt;br&gt;            let jsonDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]&lt;br&gt;            let taxRateInfos = jsonDict?[&quot;taxRateInfo&quot;] as? [[String: Any]]&lt;br&gt;            if taxRateInfos != nil &amp;&amp; taxRateInfos!.count &gt; 0 {&lt;br&gt;                let taxRateInfo = taxRateInfos?[0] as? [String: Any]&lt;br&gt;                let rate = taxRateInfo?[&quot;rate&quot;]&lt;br&gt;                let city = taxRateInfo?[&quot;city&quot;]&lt;br&gt;                &lt;br&gt;                print(&quot;City: \(city ?? &quot;&quot;), Tax Rate: \(rate ?? &quot;&quot;)&quot;)&lt;br&gt;            }&lt;br&gt;        } catch {&lt;br&gt;            print(&quot;Error&quot;)&lt;br&gt;        }&lt;br&gt;    } else {&lt;br&gt;        print(&quot;Unexpected error.&quot;)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;}.resume()&lt;br&gt;&lt;br&gt;それでは、コードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;let url = URL(string: &quot;https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByLngLat?longitude=\(longitude)&amp;latitude=\(latitude)&quot;)!&lt;br&gt;&lt;br&gt;var request = URLRequest(url: url)&lt;br&gt;request.httpMethod = &quot;GET&quot;&lt;br&gt;6 行目では、緯度・経度を含めた、CDTFA Tax Rate API の URL を生成しています。&lt;br&gt;&lt;br&gt;8 ~ 9 行目で URL から URLRequest オブジェクトを生成し、httpMethod に GET を指定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;URLSession.shared.dataTask(with: request) {(data, response, error) in&lt;br&gt;11 行目からが、URLSession の dataTask() で「リクエストの送信・レスポンスの受け取り・その後の処理」をタスクとして定義している箇所です。&lt;br&gt;&lt;br&gt;先ほど生成した request を with で渡しています。&lt;br&gt;&lt;br&gt;data にはサーバーから送られてきたデータが、response にはレスポンスの HTTP ヘッダーやステータスコードなどのレスポンスのメタデータが、error にはリクエストが失敗した時のみ、失敗した理由が入っています。&lt;br&gt;&lt;br&gt;&lt;br&gt;if let error = error {&lt;br&gt;    print(&quot;Unexpected error: \(error.localizedDescription).&quot;)&lt;br&gt;    return;&lt;br&gt;}&lt;br&gt;error に値が入っている時は、そのエラーを print して return しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;if let response = response as? HTTPURLResponse {&lt;br&gt;    if !(200...299).contains(response.statusCode) {&lt;br&gt;        print(&quot;Request Failed - Status Code: \(response.statusCode).&quot;)&lt;br&gt;        return&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;ここでは、response を HTTPURLResponse にキャストして、レスポンスのステータスコードをチェックしています。&lt;br&gt;&lt;br&gt;200 番台（Success) ではない時はステータスコードを print して return しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;if let data = data {&lt;br&gt;    do {&lt;br&gt;        let jsonDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]&lt;br&gt;        let taxRateInfos = jsonDict?[&quot;taxRateInfo&quot;] as? [[String: Any]]&lt;br&gt;        if taxRateInfos != nil &amp;&amp; taxRateInfos!.count &gt; 0 {&lt;br&gt;            let taxRateInfo = taxRateInfos?[0] as? [String: Any]&lt;br&gt;            let rate = taxRateInfo?[&quot;rate&quot;]&lt;br&gt;            let city = taxRateInfo?[&quot;city&quot;]&lt;br&gt;            &lt;br&gt;            print(&quot;City: \(city ?? &quot;&quot;), Tax Rate: \(rate ?? &quot;&quot;)&quot;)&lt;br&gt;        }&lt;br&gt;    } catch {&lt;br&gt;        print(&quot;Error&quot;)&lt;br&gt;    }&lt;br&gt;} else {&lt;br&gt;    print(&quot;Unexpected error.&quot;)&lt;br&gt;}&lt;br&gt;そして、レスポンスで受け取ったデータから、rate と city を取得して print しています。&lt;br&gt;&lt;br&gt;詳しくは「Swift で Dictionary を使って JSON からデータを抽出する」でご説明しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;}.resume()&lt;br&gt;最後に resume() メソッドで定義したタスクをスタートしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これを playground で実行すると以下のようになります。&lt;br&gt;&lt;br&gt;City: ANAHEIM, Tax Rate: 0.0775&lt;br&gt;Swift - URLSession で HTTP リクエスト (GET) する方法 1&lt;br&gt;&lt;br&gt;ディズニーランドのある Anaheim 市の税率 0.0775 (7.75%) が取得できました。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で URLSession を使って、HTTP のリクエスト (GET) する方法をご説明しました。</description><pubDate>Thu, 12 Jan 2023 10:35:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift で Dictionary を使って JSON からデータを抽出する</title><link>https://softmoco.com/swift/swift-how-to-parse-json-with-dictionary.php</link><description>Swift で Dictionary を使って JSON からデータを抽出する&lt;br&gt;&lt;br&gt;前回「Swift で JSON の読み書き」では、struct を定義して、JSON の文字列から struct のオブジェクトに変換する方法をご紹介しました。&lt;br&gt;&lt;br&gt;ここでは struct を定義せずに、Dictionary を使って Swift で JSON からデータを抽出する方法についてご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;JSON 文字列を Swift の Dictionary へ変換する&lt;br&gt;今回は JSON の文字列から Swift の Dictionary に変換して、データを取得します。&lt;br&gt;&lt;br&gt;&lt;br&gt;例として、次のような JSON 文字列から値を抽出します。&lt;br&gt;&lt;br&gt;これは、CDTFA Tax Rate API というカリフォルニアの税率を取得する API のレスポンスで返ってくる JSON です。&lt;br&gt;&lt;br&gt;{&lt;br&gt;    &quot;taxRateInfo&quot;:[&lt;br&gt;        {&lt;br&gt;            &quot;rate&quot;:0.0775,&lt;br&gt;            &quot;jurisdiction&quot;:&quot;ANAHEIM&quot;,&lt;br&gt;            &quot;city&quot;:&quot;ANAHEIM&quot;,&lt;br&gt;            &quot;county&quot;:&quot;ORANGE&quot;,&lt;br&gt;            &quot;tac&quot;:&quot;300110370000&quot;&lt;br&gt;        }&lt;br&gt;    ],&lt;br&gt;    &quot;geocodeInfo&quot;:{&lt;br&gt;        &quot;bufferDistance&quot;:50&lt;br&gt;    },&lt;br&gt;    &quot;termsOfUse&quot;:&quot;https://www.cdtfa.ca.gov/dataportal/policy.htm&quot;,&lt;br&gt;    &quot;disclaimer&quot;:&quot;https://www.cdtfa.ca.gov/dataportal/disclaimer.htm&quot;&lt;br&gt;}&lt;br&gt;&lt;br&gt;この JSON 文字列から、taxRateInfo の rate と city を取得するには次のようにできます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let jsonString = &quot;&quot;&quot;&lt;br&gt;{&lt;br&gt;   &quot;taxRateInfo&quot;:[&lt;br&gt;      {&lt;br&gt;         &quot;rate&quot;:0.0775,&lt;br&gt;         &quot;jurisdiction&quot;:&quot;ANAHEIM&quot;,&lt;br&gt;         &quot;city&quot;:&quot;ANAHEIM&quot;,&lt;br&gt;         &quot;county&quot;:&quot;ORANGE&quot;,&lt;br&gt;         &quot;tac&quot;:&quot;300110370000&quot;&lt;br&gt;      }&lt;br&gt;   ],&lt;br&gt;   &quot;geocodeInfo&quot;:{&lt;br&gt;      &quot;bufferDistance&quot;:50&lt;br&gt;   },&lt;br&gt;   &quot;termsOfUse&quot;:&quot;https://www.cdtfa.ca.gov/dataportal/policy.htm&quot;,&lt;br&gt;   &quot;disclaimer&quot;:&quot;https://www.cdtfa.ca.gov/dataportal/disclaimer.htm&quot;&lt;br&gt;}&lt;br&gt;&quot;&quot;&quot;&lt;br&gt;&lt;br&gt;do {&lt;br&gt;    let jsonDict = try JSONSerialization.jsonObject(with: Data(jsonString.utf8)) as? [String: Any]&lt;br&gt;    let taxRateInfos = jsonDict?[&quot;taxRateInfo&quot;] as? [[String: Any]]&lt;br&gt;    if taxRateInfos != nil &amp;&amp; taxRateInfos!.count &gt; 0 {&lt;br&gt;        let rate = taxRateInfos![0][&quot;rate&quot;]&lt;br&gt;        let city = taxRateInfos![0][&quot;city&quot;]&lt;br&gt;        &lt;br&gt;        print(&quot;City: \(city ?? &quot;&quot;), Tax Rate: \(rate ?? &quot;&quot;)&quot;)&lt;br&gt;    }&lt;br&gt;} catch {&lt;br&gt;    print(&quot;Unexpected error: \(error).&quot;)&lt;br&gt;}&lt;br&gt;23 行目で　JSONSerialization.jsonObject() メソッドを使って、jsonString から、jsonObject に変換し、それをさらに、行目で、[String: Any] 型の Dictionary に変換して jsonDict に代入しています。&lt;br&gt;&lt;br&gt;24 行目で、jsonDict のキーが taxRateInfo の値を [String: Any] 型の Dictionary の配列に変換して taxRateInfos に代入しています。&lt;br&gt;&lt;br&gt;taxRateInfos が nil でなく、要素の数が 1 以上の時のみ、ひとつめの要素 (index = 0) のキーが rate と city の値を取得して print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;playground で実行すると、結果は次のようになり、city と rate の値が取得できているのがわかります。&lt;br&gt;&lt;br&gt;Swift で Dictionary を使って JSON からデータを抽出する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;このように、抽出したい値まで、JSON の構造に合わせて順番に Dictionary に変換していくことによっても、JSON 文字列から値を抽出することができます。&lt;br&gt;&lt;br&gt;struct を定義して、まるっとオブジェクトに変換するまでもなく、一部のデータだけ抽出して使いたいような時に便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で Dictionary を使って JSON からデータを抽出する方法についてご説明しました。</description><pubDate>Fri, 23 Dec 2022 08:34:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift)</title><link>https://softmoco.com/basics/how-to-pass-data-between-view-controllers-using-delegate.php</link><description>iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift)&lt;br&gt;&lt;br&gt;iOS アプリの View Controller 間でデータを受け渡しする方法は何通りかあります。&lt;br&gt;&lt;br&gt;ここでは、Swift で Delegate を使って View Controller 間で値を渡す方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は、以下のような、メインの画面でコメントを入力スペースが小さい場合に、複数行のコメントを入力するための画面をモーダルで開くようなテスト用の iOS アプリを作ります。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 1&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;データを受け渡しする、テスト iOS アプリの準備をする&lt;br&gt;Delegate を使って View Controller 間で値を渡す方法&lt;br&gt;データを受け渡しする、テスト iOS アプリの準備をする&lt;br&gt;まずはテスト用にデータを受け渡しする、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に TextView を小さめにひとつと、Comment というボタンをひとつ追加します。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 2&lt;br&gt;&lt;br&gt;オブジェクトの追加の方法や、アウトレットの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;アシスタントエディタを開き、Text View のアウトレットを commentTextView という名前で、Comment ボタンの TouchUpInside のアクションを commentTapped という名前で生成しておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var commentTextView: UITextView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func commentTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;次にモーダルで表示する画面用の View Controller を追加します。&lt;br&gt;&lt;br&gt;先に View Controller の Custom クラス用のファイルを生成します。&lt;br&gt;&lt;br&gt;Xcode のメニューから [File] &gt; [New] &gt; [File...] を選択します。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 3&lt;br&gt;&lt;br&gt;&lt;br&gt;[iOS] の [Cocoa Touch Class] を選択して [Next] ボタンをクリックします。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 4&lt;br&gt;&lt;br&gt;&lt;br&gt;お好きなクラス名を入力します。今回は CommentViewController にしました。 Subclass of を UIViewController にして [Next] ボタンをクリックし、次の画面でファイルを生成してください。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Main ストーリーボードにもどって、View Controller を追加し、Custom Class に先ほど作った CommentViewController を設定します。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 6&lt;br&gt;&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、大きめの Text View ひとつと、OK と Cancel というボタンをひとつずつ追加しておきます。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 7&lt;br&gt;&lt;br&gt;&lt;br&gt;アシスタントエディタを開き、Text View のアウトレットを commentTextView という名前で、OK と Cancel ボタンの TouchUpInside のアクションを okTapped と cancelTapped という名前で生成しておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class CommentViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var commentTextView: UITextView!&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func okTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func cancelTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;そして、View Controller 間をむすぶ、Segue を作ります。&lt;br&gt;&lt;br&gt;ひとつめの ViewController の Comment ボタンから、右クリックで CommentViewController にドラッグします。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 8&lt;br&gt;&lt;br&gt;二つ目の View Controller に遷移する前に、バリデーションなどをして、OK な時のみ次の画面に遷移したい場合は、ボタンからではなく、ひとつめの ViewController から Segue を作って、commentTapped() で遷移したいタイミングで performSegue(withIdentifier:sender:) を実行して遷移できます。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 8-2&lt;br&gt;&lt;br&gt;&lt;br&gt;ポップアップが出てきますので、Present Modally を選択します。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 9&lt;br&gt;&lt;br&gt;&lt;br&gt;生成された Segue を選択して、identifier に showCommentSegue を設定しておいてください。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 10&lt;br&gt;&lt;br&gt;&lt;br&gt;Delegate を使って View Controller 間で値を渡す方法&lt;br&gt;今回は二つ目の Comment View Controller の OK ボタンか Cancel ボタンがタップされた時に、Comment Text View の値をひとつめの View Controller に渡すのに Delegate を使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode のメニューから [File] &gt; [New] &gt; [File...] を選択し、[iOS] の [Swift File] を選択して [Next] ボタンをクリックします。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 11&lt;br&gt;&lt;br&gt;&lt;br&gt;CommentDelegate.swift という名前で Swift ファイルを生成します。&lt;br&gt;&lt;br&gt;iOS アプリで Delegate を使って View Controller 間で値を渡す方法 (Swift) 12&lt;br&gt;&lt;br&gt;&lt;br&gt;作った CommentDelegate.swift に次のような CommentDelegate という名前でプロトコルを定義しておきます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;protocol CommentDelegate: AnyObject&lt;br&gt;{&lt;br&gt;    func commentEntered(text: String, cancelled: Bool)&lt;br&gt;}&lt;br&gt;&lt;br&gt;このプロトコルをひとつめの View Controller でコンフォームしておき、Comment View Controller で OK もしくは Cancel ボタンがタップされた時に commentEntered() メソッドを使って値を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;ひとつ目の ViewController クラスを次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, CommentDelegate {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var commentTextView: UITextView!&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;&lt;br&gt;        commentTextView.layer.borderColor = UIColor.lightGray.cgColor&lt;br&gt;        commentTextView.layer.borderWidth = 0.5&lt;br&gt;        commentTextView.layer.cornerRadius = 5&lt;br&gt;        commentTextView.contentInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func commentTapped(_ sender: Any) {&lt;br&gt;        self.view.endEditing(true)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {&lt;br&gt;        if segue.identifier == &quot;showCommentSegue&quot; {&lt;br&gt;            if let vc = segue.destination as? CommentViewController {&lt;br&gt;                vc.commentText = commentTextView.text&lt;br&gt;                vc.commentDelegate = self&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    func commentEntered(text: String, cancelled: Bool) {&lt;br&gt;        if !cancelled {&lt;br&gt;            commentTextView.text = text&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;二つ目の CommentViewController クラスを次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class CommentViewController: UIViewController {&lt;br&gt;&lt;br&gt;    var commentText: String?&lt;br&gt;    weak var commentDelegate: CommentDelegate?&lt;br&gt;&lt;br&gt;    @IBOutlet weak var commentTextView: UITextView!&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;&lt;br&gt;        commentTextView.layer.borderColor = UIColor.lightGray.cgColor&lt;br&gt;        commentTextView.layer.borderWidth = 0.5&lt;br&gt;        commentTextView.layer.cornerRadius = 5&lt;br&gt;        commentTextView.contentInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)&lt;br&gt;        commentTextView.text = commentText&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func okTapped(_ sender: Any) {&lt;br&gt;        self.view.endEditing(true)&lt;br&gt;        commentDelegate?.commentEntered(text: commentTextView.text, cancelled: false)&lt;br&gt;        self.dismiss(animated: true)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @IBAction func cancelTapped(_ sender: Any) {&lt;br&gt;        self.view.endEditing(true)&lt;br&gt;        commentDelegate?.commentEntered(text: commentTextView.text, cancelled: true)&lt;br&gt;        self.dismiss(animated: true)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;まず、ひとつ目の ViewController クラスのコードをご説明します。&lt;br&gt;&lt;br&gt;CommentDelegate をコンフォームするのに、3 行目で class ViewController: UIViewController, CommentDelegate のように指定し、29 行目 ~ 33 行目で commentEntered() を定義しています。&lt;br&gt;&lt;br&gt;commentEntered() では、cancelled が false の時に text を commentTextView.text に代入するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;10 ~ 13 行目は viewDidLoad() 内で、Text View のボーダーなどを設定しています。詳しくは「Text View にボーダーを追加する方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;16 ~ 18 行目は Comment ボタンがタップされた時に実行される箇所です。&lt;br&gt;&lt;br&gt;self.view.endEditing(true) でキーボードを閉じています。&lt;br&gt;&lt;br&gt;&lt;br&gt;20 ~ 27 行目では prepare(for:sender:) を override しています。&lt;br&gt;&lt;br&gt;prepare(for:sender:) は segue が実行される前に実行されるメソッドです。&lt;br&gt;&lt;br&gt;segue.identifier が showCommentSegue の時は、if let で segue.destination が CommentViewController にキャストしています。&lt;br&gt;&lt;br&gt;CommentViewController の commentText に commentTextView.text の値を、commentDelegate に self でこの ViewController を代入しています。&lt;br&gt;&lt;br&gt;ひとつ目の View Controller から二つ目の View Controller に値を渡したい時は、このように渡せます。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、二つ目のの CommentViewController クラスのコードをご説明します。&lt;br&gt;&lt;br&gt;5 行目では、コメントの文字列をうけとるために nullable の String 型の commentText を定義しています。&lt;br&gt;&lt;br&gt;6 行目では、コメントの文字列をひとつめの View Controller に返すために、 nullable の CommentDelegate 型の commentDelegate を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;13 ~ 16 行目は viewDidLoad() 内で、Text View のボーダーなどを設定しています。&lt;br&gt;&lt;br&gt;17 行目で、ひとつめの View Controller から渡ってきた値を commentTextView.text にセットしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;20 ~ 24 行目は OK ボタンがタップされた時に実行される箇所です。&lt;br&gt;&lt;br&gt;self.view.endEditing(true) でキーボードを閉じています。&lt;br&gt;&lt;br&gt;delegate?.commentEntered(text: commentTextView.text, cancelled: false) で、ひとつ目の View Controller の commentEntered() を text に commentTextView.text と cancelled に false を渡して実行しています。&lt;br&gt;&lt;br&gt;self.dismiss(animated: true) でモーダルで表示しているこの画面を閉じています。&lt;br&gt;&lt;br&gt;&lt;br&gt;26 ~ 30 行目は Cancel ボタンがタップされた時に実行される箇所です。&lt;br&gt;&lt;br&gt;okTapped() とほぼ同じで、違いは delegate?.commentEntered(text: commentTextView.text, cancelled: true) で、cancelled に true を渡して実行している点のみです。&lt;br&gt;&lt;br&gt;&lt;br&gt;これをビルドして実行すると、動画のような iOS アプリのできあがりです。&lt;br&gt;&lt;br&gt;以上、Swift で Delegate を使って View Controller 間で値を渡す方法をご説明しました。</description><pubDate>Wed, 07 Dec 2022 22:19:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Text View にボーダーを追加する方法 (Swift)</title><link>https://softmoco.com/basics/how-to-add-border-to-text-view.php</link><description>Text View にボーダーを追加する方法 (Swift)&lt;br&gt;&lt;br&gt;ここでは、Swift で iOS アプリの Text View にボーダーを追加する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;複数行のテキストを入力可能にしたい時は、UITextField ではなく UITextView を使うことになると思います。&lt;br&gt;&lt;br&gt;この UITextView ですが、デフォルトではボーダーがついていません。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、iOS アプリのストーリーボードに次のように、Text View とボタンを追加します。&lt;br&gt;&lt;br&gt;Text View にボーダーを追加する方法 (Swift) 1&lt;br&gt;&lt;br&gt;&lt;br&gt;これをシミュレーターで実行すると以下のようになります。&lt;br&gt;&lt;br&gt;Text View にボーダーを追加する方法 (Swift) 2&lt;br&gt;&lt;br&gt;&lt;br&gt;多くの場合は、ボーダーが欲しいと思いますので、ボーダーを追加する方法をご紹介します。&lt;br&gt;&lt;br&gt;ViewController.swift をアシスタントエディタで開き、UITextView のアウトレットを noteTextView という名前で作っておきます。&lt;br&gt;&lt;br&gt;オブジェクトの追加の方法や、アウトレットの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Text View にボーダーを追加する方法 (Swift) 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var noteTextView: UITextView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;そして、ViewController.swift の viewDidLoad() に以下のコードを追加します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var noteTextView: UITextView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        noteTextView.layer.borderColor = UIColor.lightGray.cgColor&lt;br&gt;        noteTextView.layer.borderWidth = 0.5&lt;br&gt;        noteTextView.layer.cornerRadius = 5&lt;br&gt;        noteTextView.contentInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Text View にボーダーを追加する方法 (Swift) 4&lt;br&gt;&lt;br&gt;10 行目では、Text View のボーダーの色をライトグレーに設定しています。&lt;br&gt;&lt;br&gt;11 行目では、Text View のボーダーの幅を 0.5 に設定しています。&lt;br&gt;&lt;br&gt;12 行目では、Text View の cornerRadius に 5 を設定して、ボーダーの四隅をすこし丸めています。&lt;br&gt;&lt;br&gt;13 行目では、Text View の中の文字が端に近づきすぎないように、UIEdgeInsets を使って、少し端からの余白を追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これをシミュレーターで実行すると次のようになります。&lt;br&gt;&lt;br&gt;Text View にボーダーを追加する方法 (Swift) 5&lt;br&gt;&lt;br&gt;Text View に薄いグレーのボーダーが表示されていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;文字を入力してみるとこんな感じになります。&lt;br&gt;&lt;br&gt;Text View にボーダーを追加する方法 (Swift) 6&lt;br&gt;&lt;br&gt;お好みに応じて、ボーダーの色や太さなどを変更してお使いください。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリの Text View にボーダーを追加する方法をご説明しました。</description><pubDate>Tue, 06 Dec 2022 05:39:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Xcode - ドロップダウンリストの代わりに Picker View を使う方法 (Swift)</title><link>https://softmoco.com/basics/how-to-use-picker-view.php</link><description>Xcode - ドロップダウンリストの代わりに Picker View を使う方法 (Swift)&lt;br&gt;&lt;br&gt;UIKit で標準で用意されているコントロールにはドロップダウンリストがありません。&lt;br&gt;&lt;br&gt;ドロップダウンリストのように選択肢の中から選んで入力させたい時には、以下のように代わりに Picker View を使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は Xcode でドロップダウンリストの代わりに Picker View を使う方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Picker View を使う iOS アプリの準備をする&lt;br&gt;Swift で Picker View を使う方法&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;Picker View を使う iOS アプリの準備をする&lt;br&gt;まずはテスト用に Picker View を使う iOS アプリを作ります。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Country: というラベルをひとつと、Text Field をひとつ追加します。&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 1&lt;br&gt;&lt;br&gt;&lt;br&gt;UITextField から、countryTextField という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 2&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var countryTextField: UITextField!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift で Picker View を使う方法&lt;br&gt;それでは、Swift で Picker View で値を選択させるコードを書いていきましょう。&lt;br&gt;&lt;br&gt;ViewController で Picker View からのイベント受け取って、Text Field に値をセットするために、UIPickerViewDataSource、UIPickerViewDelegate、UITextFieldDelegate をコンフォームしておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var countryTextField: UITextField!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;そして ViewController.swift に次のコードを追加してください。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var countryTextField: UITextField!&lt;br&gt;    &lt;br&gt;    var countries: [String] = []&lt;br&gt;    weak var pickerView: UIPickerView?&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;&lt;br&gt;        countries.append(&quot;&quot;)&lt;br&gt;        countries.append(&quot;Australia&quot;)&lt;br&gt;        countries.append(&quot;Canada&quot;)&lt;br&gt;        countries.append(&quot;Japan&quot;)&lt;br&gt;        countries.append(&quot;United States&quot;)&lt;br&gt;&lt;br&gt;        let pv = UIPickerView()&lt;br&gt;        pv.delegate = self&lt;br&gt;        pv.dataSource = self&lt;br&gt;&lt;br&gt;        countryTextField.delegate = self&lt;br&gt;        countryTextField.inputAssistantItem.leadingBarButtonGroups = []&lt;br&gt;        countryTextField.inputView = pv&lt;br&gt;        self.pickerView = pv&lt;br&gt;&lt;br&gt;        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))&lt;br&gt;        tap.cancelsTouchesInView = false&lt;br&gt;        self.view.addGestureRecognizer(tap)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @objc func dismissKeyboard() {&lt;br&gt;        self.view.endEditing(true)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    func numberOfComponents(in pickerView: UIPickerView) -&gt; Int {&lt;br&gt;        return 1&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -&gt; Int {&lt;br&gt;        return countries.count&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&gt; String? {&lt;br&gt;        return countries[row]&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {&lt;br&gt;        countryTextField.text = countries[row]&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;コードを順を追って説明します。&lt;br&gt;&lt;br&gt;7 行目で Picker View に表示する選択肢の値を保持する countries という文字列の配列を定義しています。&lt;br&gt;&lt;br&gt;8 行目で、今画面で使う pickerView と言う名前の UIPickerView を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;viewDidLoad() 内の 13 ~ 17 行目では、countries に選択肢となる値を追加しています。&lt;br&gt;&lt;br&gt;19 ~ 21 行目では、UIPickerView を定義し、このクラスをそのデータソースに指定してイベントを受け取るために、delegate と dataSource に self を設定しています。&lt;br&gt;&lt;br&gt;23 ~ 26 行目では、このクラスで countryTextField からのイベントを受け取るために delegate を self に設定し、入力の候補が出ないようにして、countryTextField の入力に先ほど定義した UIPickerView を使うように設定し、self.pickerView にその UIPickerView を代入しています。&lt;br&gt;&lt;br&gt;28 ~ 35 行目では、選択した後に、画面のどこかをタップした時に、Picker View を隠すように UITapGestureRecognizer を追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;37 ~ 39 行の numberOfComponents(in:) は UIPickerViewDataSource プロトコルの必須のインスタンスメソッドで、データソースのカラムの数を返す必要があります。今回は 1 を返しています。&lt;br&gt;&lt;br&gt;41 ~ 43 行の pickerView(_:numberOfRowsInComponent:) も UIPickerViewDataSource プロトコルの必須のインスタンスメソッドで、データソースの行の数を返す必要があります。countries.count で選択肢の数を返しています。&lt;br&gt;&lt;br&gt;45 ~ 47 行の pickerView(_:titleForRow:forComponent:) で、選択肢に表示される値を countries[row] で取得して返しています。&lt;br&gt;&lt;br&gt;49 ~ 51 行の pickerView(_:didSelectRow:inComponent:) で、Picker View の値が選択された時に、countryTextField.text に選択された値を代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上が、Picker View で値を選択させるコードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリをシミュレーターでテストする&lt;br&gt;それでは、作った iOS アプリをビルドして実行してみましょう。&lt;br&gt;&lt;br&gt;ツールバー左側の  ボタンをクリックすると、選択されているシミュレータが立ち上がり、アプリがインストールされて実行されます。&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 3&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 4&lt;br&gt;&lt;br&gt;&lt;br&gt;Text Field をタップすると下に Picker View が表示されます。&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Picker View で値を選択すると、Text Field に選んだ値がセットされます。&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 6&lt;br&gt;&lt;br&gt;&lt;br&gt;空いているところをタップすると、Picker View が閉じます。&lt;br&gt;&lt;br&gt;ドロップダウンリストの代わりに Picker View を使う方法 (Swift) 7&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode でドロップダウンリストの代わりに Picker View を使う方法をご説明しました。</description><pubDate>Tue, 11 Oct 2022 21:33:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - iOS アプリで SQLite ファイルの場所を確認する方法</title><link>https://softmoco.com/sqlite/swift-sqlite-file-location.php</link><description>Swift - iOS アプリで SQLite ファイルの場所を確認する方法&lt;br&gt;&lt;br&gt;ここでは、Swift で iOS アプリで使われている SQLite ファイルの場所を確認する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;iOS アプリで SQLite ファイルのパスを確認する&lt;br&gt;Mac で SQLite ファイルのパスを Finder で開く&lt;br&gt;iOS アプリで SQLite ファイルのパスを確認する&lt;br&gt;iOS アプリで使われている SQLite ファイルの場所を確認するには、NSSearchPathForDirectoriesInDomains() 関数が使えます。&lt;br&gt;&lt;br&gt;NSSearchPathForDirectoriesInDomains() 関数は指定した引数のディレクトリのパスのリストを返す関数です。&lt;br&gt;&lt;br&gt;func NSSearchPathForDirectoriesInDomains(&lt;br&gt;    _ directory: FileManager.SearchPathDirectory,&lt;br&gt;    _ domainMask: FileManager.SearchPathDomainMask,&lt;br&gt;    _ expandTilde: Bool&lt;br&gt;) -&gt; [String]&lt;br&gt;&lt;br&gt;SQLite ファイルはユーザのドキュメントディレクトリに保存されるので、FileManager.SearchPathDirectory には .documentDirectory（Document ディレクトリ）を FileManager.SearchPathDomainMask には .userDomainMask（ユーザのホームディレクトリ）を指定します。&lt;br&gt;&lt;br&gt;&lt;br&gt;「Swift - SQLite でデータを挿入 (INSERT)」のコードの viewDidLoad() に次のコードを追加してシミュレーターで実行してみます。&lt;br&gt;&lt;br&gt;print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))&lt;br&gt;Swift - iOS アプリで SQLite ファイルの場所を確認する方法 1&lt;br&gt;&lt;br&gt;[&quot;/Users/user1/Library/Developer/CoreSimulator/Devices/1ECB918D-0D16-47C1-980D-2620697B6C9F/data/Containers/Data/Application/812FBEC1-1FA8-414A-815A-9CCC70F4D509/Documents&quot;]&lt;br&gt;Opened connection to database&lt;br&gt;Insert success&lt;br&gt;SQLite ファイルが保存されている、ユーザホームディレクトリの Document ディレクトリのパスがプリントされました。&lt;br&gt;&lt;br&gt;&lt;br&gt;Mac で SQLite ファイルのパスを Finder で開く&lt;br&gt;上で取得した path の場所を Mac の Finder で開いてみましょう。&lt;br&gt;&lt;br&gt;Finder のメニューから Go &gt; Go to Folder... を選択します。&lt;br&gt;&lt;br&gt;Swift - iOS アプリで SQLite ファイルの場所を確認する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;出てきた画面に先ほどの path をコピーして貼り付け、return キーを押します。&lt;br&gt;&lt;br&gt;Swift - iOS アプリで SQLite ファイルの場所を確認する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;指定したフォルダが開いて SQLite ファイルがありましたね。&lt;br&gt;&lt;br&gt;Swift - iOS アプリで SQLite ファイルの場所を確認する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリで使われている SQLite ファイルの場所を確認する方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 30 Sep 2022 08:17:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift - SQLite でデータを削除 (DELETE)</title><link>https://softmoco.com/sqlite/swift-sqlite-delete.php</link><description>Swift - SQLite でデータを削除 (DELETE)&lt;br&gt;&lt;br&gt;ここでは、Swift で SQLite のテーブルのデータを削除する方法をご説明します。&lt;br&gt;&lt;br&gt;「Swift - SQLite でデータを取得 (SELECT)」のコードに、SQLite でデータを削除するコードを追加します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;students テーブルのデータを削除する関数を定義する&lt;br&gt;students テーブルのデータを削除する&lt;br&gt;students テーブルのデータを削除する関数を定義する&lt;br&gt;ここまでで、次のような Student 構造体のデータを保持する SQLite の students テーブルにデータを挿入・更新・取得をしてきました。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var StudentID: Int&lt;br&gt;    var StudentNumber: String&lt;br&gt;    var FirstName: String&lt;br&gt;    var LastName: String&lt;br&gt;    var Age: Int?&lt;br&gt;    &lt;br&gt;    init(studentID: Int, studentNumber: String, firstName: String, lastName: String, age: Int?) {&lt;br&gt;        self.StudentID = studentID&lt;br&gt;        self.StudentNumber = studentNumber&lt;br&gt;        self.FirstName = firstName&lt;br&gt;        self.LastName = lastName&lt;br&gt;        self.Age = age&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;CREATE TABLE IF NOT EXISTS students (&lt;br&gt;    student_id INTEGER NOT NULL PRIMARY KEY,&lt;br&gt;    student_number TEXT NOT NULL,&lt;br&gt;    first_name TEXT NULL,&lt;br&gt;    last_name TEXT NULL,&lt;br&gt;    age INTEGER NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;今回は、studentID を受け取り、students テーブルからその student_id を持つデータを削除する deleteStudent 関数を作ります。&lt;br&gt;&lt;br&gt;指定された studentID は students テーブルに存在している前提ですすめます。&lt;br&gt;&lt;br&gt;&lt;br&gt;DBService.swift ファイルを開き以下のコードを追加してください。&lt;br&gt;&lt;br&gt;func deleteStudent(studentID: Int) -&gt; Bool {&lt;br&gt;    let deleteSql = &quot;DELETE FROM students WHERE student_id = ?;&quot;;&lt;br&gt;    var deleteStmt: OpaquePointer? = nil&lt;br&gt;    &lt;br&gt;    if sqlite3_prepare_v2(db, (deleteSql as NSString).utf8String, -1, &amp;deleteStmt, nil) != SQLITE_OK {&lt;br&gt;        print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;        return false&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    sqlite3_bind_int(deleteStmt, 1,Int32(studentID))&lt;br&gt;    &lt;br&gt;    if sqlite3_step(deleteStmt) != SQLITE_DONE {&lt;br&gt;        print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;        sqlite3_finalize(deleteStmt)&lt;br&gt;        return false&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    sqlite3_finalize(deleteStmt)&lt;br&gt;    return true&lt;br&gt;}&lt;br&gt;Swift - SQLite でデータを削除 (DELETE) 1&lt;br&gt;&lt;br&gt;deleteStudent 関数のコードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;まず、2 行目で、SQLite の DELETE 文のスクリプトを deleteSql に定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite で SQL 文を実行するには、その前にステートメントを準備用の関数をつかって、バイトコードプログラムにコンパイルする必要があります。&lt;br&gt;&lt;br&gt;ここでは、sqlite3_prepare_v2() 関数を使って SQL 文をコンパイルしています。&lt;br&gt;&lt;br&gt;int sqlite3_prepare_v2(&lt;br&gt;  sqlite3 *db,            /* Database handle */&lt;br&gt;  const char *zSql,       /* SQL statement, UTF-8 encoded */&lt;br&gt;  int nByte,              /* Maximum length of zSql in bytes. */&lt;br&gt;  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */&lt;br&gt;  const char **pzTail     /* OUT: Pointer to unused portion of zSql */&lt;br&gt;);&lt;br&gt;&lt;br&gt;3 行目で、sqlite3_prepare_v2() 関数に渡すステートメントハンドル用の OpaquePointer? 型の変数の deleteStmt を定義しています。&lt;br&gt;&lt;br&gt;5 行目で、sqlite3_prepare_v2() 関数に、データベースを開いた時に取得した db ハンドル、deleteSql を UTF-8 に変換した文字列、上で定義した &amp;deleteStmt などを渡して実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;sqlite3_prepare_v2() 関数 は成功したら SQLITE_OK を返し、失敗するとエラーコードを返します。&lt;br&gt;&lt;br&gt;失敗した時には getDBErrorMessage() 関数を使ってエラーコードをプリントし、false を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;10 行目では、上で準備したステートメントに、値をバインドしています。&lt;br&gt;&lt;br&gt;sqlite3_bind_int() を使って、deleteSql 文のひとつめの ? に studentID を Int32 に変換してバインドしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;12 ~ 16 行目では、sqlite3_step() 関数を使って、コンパイルした SQL文を評価して実行しています。&lt;br&gt;&lt;br&gt;sqlite3_step() 関数は成功すると SQLITE_DONE を返します。&lt;br&gt;&lt;br&gt;失敗した時は getDBErrorMessage() 関数を使ってエラーコードをプリントしています。&lt;br&gt;&lt;br&gt;return する前に、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy しています。&lt;br&gt;&lt;br&gt;指定した student_id を持つレコードが存在しなくてもエラーにはなりません。&lt;br&gt;&lt;br&gt;&lt;br&gt;18 ~ 19 行目で、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy してから true を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルのデータを削除する&lt;br&gt;それでは、作った deleteStudent() 関数を使って、データを削除してみます。&lt;br&gt;&lt;br&gt;ViewController.swift の viewDidLoad() のコードを次のように変更してください。&lt;br&gt;&lt;br&gt;//var student1 = Student(studentID: 1, studentNumber: &quot;S000001&quot;, firstName: &quot;Yuta&quot;, lastName: &quot;Tanaka&quot;, age: 16)&lt;br&gt;//&lt;br&gt;//if DBService.shared.insertStudent(student: student1) {&lt;br&gt;//    print(&quot;Insert success&quot;)&lt;br&gt;//} else {&lt;br&gt;//    print(&quot;Insert Failed&quot;)&lt;br&gt;//}&lt;br&gt;&lt;br&gt;//student1.LastName = &quot;Yamada&quot;&lt;br&gt;//student1.Age = 17&lt;br&gt;//&lt;br&gt;//if DBService.shared.updateStudent(student: student1) {&lt;br&gt;//    print(&quot;Update success&quot;)&lt;br&gt;//} else {&lt;br&gt;//    print(&quot;Update Failed&quot;)&lt;br&gt;//}&lt;br&gt;&lt;br&gt;//let (success, errorMessage, student) = DBService.shared.getStudent(studentId: 2)&lt;br&gt;//if(success){&lt;br&gt;//    if let student = student {&lt;br&gt;//        print(student)&lt;br&gt;//    } else {&lt;br&gt;//        print(&quot;Student not found&quot;)&lt;br&gt;//    }&lt;br&gt;//} else {&lt;br&gt;//    print(errorMessage ?? &quot;Error&quot;)&lt;br&gt;//}&lt;br&gt;&lt;br&gt;if DBService.shared.deleteStudent(studentID: 1) {&lt;br&gt;    print(&quot;Delete success&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;Delete Failed&quot;)&lt;br&gt;}&lt;br&gt;29 行目で、先ほど作った関数 DBService.shared.deleteStudent() に studentID: 1 を渡してデータを削除しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これを実行して、データの削除が成功すると、デバッガーのアウトプットコンソールに次のように表示されます。&lt;br&gt;&lt;br&gt;Opened connection to database&lt;br&gt;Delete success&lt;br&gt;Swift - SQLite でデータを削除 (DELETE) 2&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターで実行して、DB Browser for SQLite でできた SQLite のファイルを開いて確認してみます。&lt;br&gt;&lt;br&gt;DB Browser for SQLite についてと SQLite のファイルの場所の確認方法は、後ほど別の記事でご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルに入っていた student_id = 1 のデータが削除されています。&lt;br&gt;&lt;br&gt;Swift - SQLite でデータを削除 (DELETE) 3&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift - SQLite でデータを削除 (DELETE) 4&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で SQLite のテーブルにデータを削除する方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 16 Sep 2022 09:15:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift - SQLite でデータを取得 (SELECT)</title><link>https://softmoco.com/sqlite/swift-sqlite-select.php</link><description>Swift - SQLite でデータを取得 (SELECT)&lt;br&gt;&lt;br&gt;ここでは、Swift で SQLite のテーブルからデータを取得する方法をご説明します。&lt;br&gt;&lt;br&gt;「Swift - SQLite でデータを更新 (UPDATE)」のコードに、SQLite でデータを取得するコードを追加します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;students テーブルのデータを取得する関数を定義する&lt;br&gt;students テーブルのデータを取得する&lt;br&gt;students テーブルのデータを取得する関数を定義する&lt;br&gt;前回は次のような Student 構造体のデータを保持する SQLite の students テーブルのデータを更新しました。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var StudentID: Int&lt;br&gt;    var StudentNumber: String&lt;br&gt;    var FirstName: String&lt;br&gt;    var LastName: String&lt;br&gt;    var Age: Int?&lt;br&gt;    &lt;br&gt;    init(studentID: Int, studentNumber: String, firstName: String, lastName: String, age: Int?) {&lt;br&gt;        self.StudentID = studentID&lt;br&gt;        self.StudentNumber = studentNumber&lt;br&gt;        self.FirstName = firstName&lt;br&gt;        self.LastName = lastName&lt;br&gt;        self.Age = age&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;CREATE TABLE IF NOT EXISTS students (&lt;br&gt;    student_id INTEGER NOT NULL PRIMARY KEY,&lt;br&gt;    student_number TEXT NOT NULL,&lt;br&gt;    first_name TEXT NULL,&lt;br&gt;    last_name TEXT NULL,&lt;br&gt;    age INTEGER NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;今回は、StudentID を指定して、students テーブルからデータを取得する getStudent 関数を作ります。&lt;br&gt;&lt;br&gt;DBService.swift ファイルを開き以下のコードを追加してください。&lt;br&gt;&lt;br&gt;func getStudent(studentId: Int) -&gt; (success: Bool, errorMessage: String?, student: Student?) {&lt;br&gt; &lt;br&gt;    var student: Student? = nil&lt;br&gt;    &lt;br&gt;    let sql = &quot;&quot;&quot;&lt;br&gt;        SELECT  student_id, student_number, first_name, last_name, age&lt;br&gt;        FROM    students&lt;br&gt;        WHERE   student_id = ?;&lt;br&gt;        &quot;&quot;&quot;&lt;br&gt;    &lt;br&gt;    var stmt: OpaquePointer? = nil&lt;br&gt;    if sqlite3_prepare_v2(db, (sql as NSString).utf8String, -1, &amp;stmt, nil) != SQLITE_OK {&lt;br&gt;        return (false, &quot;Unexpected error: \(getDBErrorMessage(db)).&quot;, student)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    sqlite3_bind_int(stmt, 1, Int32(studentId))&lt;br&gt;    &lt;br&gt;    if sqlite3_step(stmt) == SQLITE_ROW {&lt;br&gt;        let studentID = Int(sqlite3_column_int(stmt, 0))&lt;br&gt;        let studentNumber = String(describing: String(cString: sqlite3_column_text(stmt, 1)))&lt;br&gt;        let firstName = String(describing: String(cString: sqlite3_column_text(stmt, 2)))&lt;br&gt;        let lastName = String(describing: String(cString: sqlite3_column_text(stmt, 3)))&lt;br&gt;        &lt;br&gt;        var age: Int?&lt;br&gt;        if (sqlite3_column_type(stmt, 4) == SQLITE_NULL) {&lt;br&gt;            age = nil&lt;br&gt;        } else {&lt;br&gt;            age = Int(sqlite3_column_int(stmt, 4))&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        student = Student(studentID: studentID, studentNumber: studentNumber,&lt;br&gt;                            firstName: firstName, lastName: lastName, age: age)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    sqlite3_finalize(stmt)&lt;br&gt;    return (true, nil, student)&lt;br&gt;}&lt;br&gt;Swift - SQLite でデータを取得 (SELECT) 1&lt;br&gt;&lt;br&gt;&lt;br&gt;getStudent 関数のコードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;入力引数は Int 型の studentID で、戻り値は (success: Bool, errorMessage: String?, student: Student?) のタプルです。&lt;br&gt;&lt;br&gt;まず、5 ~ 9 行目で、SQLite の SELECT 文のスクリプトを sql に定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite で SQL 文を実行するには、その前にステートメントを準備用の関数をつかって、バイトコードプログラムにコンパイルする必要があります。&lt;br&gt;&lt;br&gt;ここでは、sqlite3_prepare_v2() 関数を使って SQL 文をコンパイルしています。&lt;br&gt;&lt;br&gt;int sqlite3_prepare_v2(&lt;br&gt;  sqlite3 *db,            /* Database handle */&lt;br&gt;  const char *zSql,       /* SQL statement, UTF-8 encoded */&lt;br&gt;  int nByte,              /* Maximum length of zSql in bytes. */&lt;br&gt;  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */&lt;br&gt;  const char **pzTail     /* OUT: Pointer to unused portion of zSql */&lt;br&gt;);&lt;br&gt;&lt;br&gt;11 行目で、sqlite3_prepare_v2() 関数に渡すステートメントハンドル用の OpaquePointer? 型の変数の stmt を定義しています。&lt;br&gt;&lt;br&gt;12 行目で、sqlite3_prepare_v2() 関数に、データベースを開いた時に取得した db ハンドル、sql を UTF-8 に変換した文字列、上で定義した &amp;stmt などを渡して実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;sqlite3_prepare_v2() 関数 は成功したら SQLITE_OK を返し、失敗するとエラーコードを返します。&lt;br&gt;&lt;br&gt;失敗した時には getDBErrorMessage() 関数を使ってエラーコードをプリントし、false を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;16 行目で、sqlite3_bind_int() を使って、sql の ? に studentID を Int32 に変換してバインドしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;18 行目で、sqlite3_step() 関数を使って、コンパイルした SQL文を評価して実行しています。&lt;br&gt;&lt;br&gt;sqlite3_step() 関数はクエリーがデータを返すと、SQLITE_ROW を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;データが返った時は、19 ~ 32 行目でクエリー結果の値を取得しています。&lt;br&gt;&lt;br&gt;19 行目では sqlite3_column_int() を使って、一つ目の値を studentID に取得しています。&lt;br&gt;&lt;br&gt;20 ~ 22 行目では sqlite3_column_text() を使って、二つ目、三つ目、四つ目の値を studentNumber、firstName、lastName に取得しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;age は NULL になる可能性があるので、24 ~ 29 行目では sqlite3_column_type() でデータ型を確認して NULL の時は、nil を、そうでない時は sqlite3_column_int() を使って値を age に代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;31 ~ 32 行目で取得した値を元に student オブジェクトを生成しています。&lt;br&gt;&lt;br&gt;指定した studentID を持つレコードが students テーブルに存在しなかった時は、student は nil のままになります。&lt;br&gt;&lt;br&gt;35、36 行目で、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy してから、生成した student オブジェクトなどを返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルのデータを取得する&lt;br&gt;それでは、作った getStudent() 関数を使って、データを取得してみます。&lt;br&gt;&lt;br&gt;前回、「Swift - SQLite でデータを更新 (UPDATE)」で更新した student_id = 1 のデータを取得します。&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController.swift の viewDidLoad() のコードを次のように変更してください。&lt;br&gt;&lt;br&gt;//var student1 = Student(studentID: 1, studentNumber: &quot;S000001&quot;, firstName: &quot;Yuta&quot;, lastName: &quot;Tanaka&quot;, age: 16)&lt;br&gt;//&lt;br&gt;//if DBService.shared.insertStudent(student: student1) {&lt;br&gt;//    print(&quot;Insert success&quot;)&lt;br&gt;//} else {&lt;br&gt;//    print(&quot;Insert Failed&quot;)&lt;br&gt;//}&lt;br&gt;//&lt;br&gt;//student1.LastName = &quot;Yamada&quot;&lt;br&gt;//student1.Age = 17&lt;br&gt;//&lt;br&gt;//if DBService.shared.updateStudent(student: student1) {&lt;br&gt;//    print(&quot;Update success&quot;)&lt;br&gt;//} else {&lt;br&gt;//    print(&quot;Update Failed&quot;)&lt;br&gt;//}&lt;br&gt;&lt;br&gt;let (success, errorMessage, student) = DBService.shared.getStudent(studentId: 1)&lt;br&gt;if(success){&lt;br&gt;    if let student = student {&lt;br&gt;        print(student)&lt;br&gt;    } else {&lt;br&gt;        print(&quot;Student not found&quot;)&lt;br&gt;    }&lt;br&gt;} else {&lt;br&gt;    print(errorMessage ?? &quot;Error&quot;)&lt;br&gt;}&lt;br&gt;18 行目で DBService.shared.getStudent(studentId: 1) を実行して、タプルに戻り値を取得しています。&lt;br&gt;&lt;br&gt;succes が True で student が nil でない時は student を print しています。&lt;br&gt;&lt;br&gt;student が nil の時は &quot;Student not found&quot; を、success が False の時はエラーメッセージを print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これを実行すると、デバッガーのアウトプットコンソールに次のように表示されます。&lt;br&gt;&lt;br&gt;Opened connection to database&lt;br&gt;Student(StudentID: 1, StudentNumber: &quot;S000001&quot;, FirstName: &quot;Yuta&quot;, LastName: &quot;Yamada&quot;, Age: Optional(17))&lt;br&gt;Swift - SQLite でデータを取得 (SELECT) 2&lt;br&gt;&lt;br&gt;student_id = 1 の student の情報が取得できています。&lt;br&gt;&lt;br&gt;&lt;br&gt;入力引数の studentId を 2 に変更して実行すると次のようになります。&lt;br&gt;&lt;br&gt;Opened connection to database&lt;br&gt;Student not found&lt;br&gt;Swift - SQLite でデータを取得 (SELECT) 3&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で SQLite のテーブルのデータを取得する方法をご説明しました。&lt;br&gt;&lt;br&gt;次は Swift で SQLite のデータを削除します。</description><pubDate>Sat, 10 Sep 2022 00:22:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift - SQLite でデータを更新 (UPDATE)</title><link>https://softmoco.com/sqlite/swift-sqlite-update.php</link><description>Swift - SQLite でデータを更新 (UPDATE)&lt;br&gt;&lt;br&gt;ここでは、Swift で SQLite のテーブルのデータを更新する方法をご説明します。&lt;br&gt;&lt;br&gt;「Swift - SQLite でデータを挿入 (INSERT)」のコードに、SQLite でデータを更新するコードを追加します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;students テーブルのデータを更新する関数を定義する&lt;br&gt;students テーブルのデータを更新する&lt;br&gt;students テーブルのデータを更新する関数を定義する&lt;br&gt;前回は次のような Student 構造体のデータを保持する SQLite の students テーブルにデータを挿入しました。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var StudentID: Int&lt;br&gt;    var StudentNumber: String&lt;br&gt;    var FirstName: String&lt;br&gt;    var LastName: String&lt;br&gt;    var Age: Int?&lt;br&gt;    &lt;br&gt;    init(studentID: Int, studentNumber: String, firstName: String, lastName: String, age: Int?) {&lt;br&gt;        self.StudentID = studentID&lt;br&gt;        self.StudentNumber = studentNumber&lt;br&gt;        self.FirstName = firstName&lt;br&gt;        self.LastName = lastName&lt;br&gt;        self.Age = age&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;CREATE TABLE IF NOT EXISTS students (&lt;br&gt;    student_id INTEGER NOT NULL PRIMARY KEY,&lt;br&gt;    student_number TEXT NOT NULL,&lt;br&gt;    first_name TEXT NULL,&lt;br&gt;    last_name TEXT NULL,&lt;br&gt;    age INTEGER NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;今回は、Student オブジェクトを受け取り、students テーブルのデータを更新する updateStudent 関数を作ります。&lt;br&gt;&lt;br&gt;DBService.swift ファイルを開き以下のコードを追加してください。&lt;br&gt;&lt;br&gt;func updateStudent(student: Student) -&gt; Bool {    &lt;br&gt;    let updateSql = &quot;&quot;&quot;&lt;br&gt;    UPDATE  students&lt;br&gt;    SET     student_number = ?,&lt;br&gt;            first_name = ?,&lt;br&gt;            last_name = ?,&lt;br&gt;            age = ?&lt;br&gt;    WHERE   student_id = ?&lt;br&gt;    &quot;&quot;&quot;&lt;br&gt;    var updateStmt: OpaquePointer? = nil&lt;br&gt;    &lt;br&gt;    if sqlite3_prepare_v2(db, (updateSql as NSString).utf8String, -1, &amp;updateStmt, nil) != SQLITE_OK {&lt;br&gt;        print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;        return false&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    sqlite3_bind_text(updateStmt, 1, (student.StudentNumber as NSString).utf8String, -1, nil)&lt;br&gt;    sqlite3_bind_text(updateStmt, 2, (student.FirstName as NSString).utf8String, -1, nil)&lt;br&gt;    sqlite3_bind_text(updateStmt, 3, (student.LastName as NSString).utf8String, -1, nil)&lt;br&gt;    &lt;br&gt;    if student.Age == nil {&lt;br&gt;        sqlite3_bind_null(updateStmt, 4)&lt;br&gt;    } else {&lt;br&gt;        sqlite3_bind_int(updateStmt, 4, Int32(student.Age!))&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    sqlite3_bind_int(updateStmt, 5, Int32(student.StudentID))&lt;br&gt;    &lt;br&gt;    if sqlite3_step(updateStmt) != SQLITE_DONE {&lt;br&gt;        print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;        sqlite3_finalize(updateStmt)&lt;br&gt;        return false&lt;br&gt;    }&lt;br&gt;    sqlite3_finalize(updateStmt)&lt;br&gt;    return true&lt;br&gt;}&lt;br&gt;Swift - SQLite でデータを更新 (UPDATE) 1&lt;br&gt;&lt;br&gt;&lt;br&gt;入力引数の student の StudentID を持つレコードが students テーブルに存在している前提です。&lt;br&gt;&lt;br&gt;updateStudent 関数のコードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;まず、2 ~ 9 行目で、SQLite の UPDATE 文のスクリプトを updateSql に定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite で SQL 文を実行するには、その前にステートメントを準備用の関数をつかって、バイトコードプログラムにコンパイルする必要があります。&lt;br&gt;&lt;br&gt;ここでは、sqlite3_prepare_v2() 関数を使って SQL 文をコンパイルしています。&lt;br&gt;&lt;br&gt;int sqlite3_prepare_v2(&lt;br&gt;  sqlite3 *db,            /* Database handle */&lt;br&gt;  const char *zSql,       /* SQL statement, UTF-8 encoded */&lt;br&gt;  int nByte,              /* Maximum length of zSql in bytes. */&lt;br&gt;  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */&lt;br&gt;  const char **pzTail     /* OUT: Pointer to unused portion of zSql */&lt;br&gt;);&lt;br&gt;&lt;br&gt;10 行目で、sqlite3_prepare_v2() 関数に渡すステートメントハンドル用の OpaquePointer? 型の変数の updateStmt を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;12 行目で、sqlite3_prepare_v2() 関数に、データベースを開いた時に取得した db ハンドル、updateSql を UTF-8 に変換した文字列、上で定義した &amp;updateStmt などを渡して実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;sqlite3_prepare_v2() 関数 は成功したら SQLITE_OK を返し、失敗するとエラーコードを返します。&lt;br&gt;&lt;br&gt;失敗した時には getDBErrorMessage() 関数を使ってエラーコードをプリントし、false を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;17 ~ 27 行目では、上で準備したステートメントに、値をバインドしています。&lt;br&gt;&lt;br&gt;文字列をバインドするには sqlite3_bind_text()、整数をバインドするには sqlite3_bind_int() のようにデータ型によって違う関数を使います。&lt;br&gt;&lt;br&gt;17 行目では sqlite3_bind_text() を使って、updateSql 文のひとつ目の ? に student.StudentNumber を UTF-8 に変換してバインドしています。&lt;br&gt;&lt;br&gt;同様に 18、19 行目では sqlite3_bind_text() を使って、二つ目と三つ目の ? に student.FirstName と student.LastName をバインドしています。&lt;br&gt;&lt;br&gt;21 ~ 25 行目では、四つ目の ? に student.Age が null の時は sqlite3_bind_null() を使って null をバインドして、null 出ない時は sqlite3_bind_int() を使って student.Age をバインドしています。&lt;br&gt;&lt;br&gt;27 行目では sqlite3_bind_int() を使って、五つ目の ? に student.StudentID を Int32 に変換してバインドしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;29 ~ 33 行目では、sqlite3_step() 関数を使って、コンパイルした SQL文を評価して実行しています。&lt;br&gt;&lt;br&gt;sqlite3_step() 関数は成功すると SQLITE_DONE を返します。&lt;br&gt;&lt;br&gt;失敗した時は getDBErrorMessage() 関数を使ってエラーコードをプリントしています。&lt;br&gt;&lt;br&gt;return する前に、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;34、35 行目で、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy してから true を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルのデータを更新する&lt;br&gt;それでは、作った updateStudent() 関数を使って、データを更新してみます。&lt;br&gt;&lt;br&gt;前回、「Swift - SQLite でデータを挿入 (INSERT)」でインサートしたデータを更新します。&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController.swift の viewDidLoad() のコードを次のように変更してください。&lt;br&gt;&lt;br&gt;var student1 = Student(studentID: 1, studentNumber: &quot;S000001&quot;, firstName: &quot;Yuta&quot;, lastName: &quot;Tanaka&quot;, age: 16)&lt;br&gt;        &lt;br&gt;//        if DBService.shared.insertStudent(student: student1) {&lt;br&gt;//            print(&quot;Insert success&quot;)&lt;br&gt;//        } else {&lt;br&gt;//            print(&quot;Insert Failed&quot;)&lt;br&gt;//        }&lt;br&gt;&lt;br&gt;student1.LastName = &quot;Yamada&quot;&lt;br&gt;student1.Age = 17&lt;br&gt;&lt;br&gt;if DBService.shared.updateStudent(student: student1) {&lt;br&gt;    print(&quot;Update success&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;Update Failed&quot;)&lt;br&gt;}&lt;br&gt;9 ~ 10 行目で student1 の LastName と Age の値を変更しています。&lt;br&gt;&lt;br&gt;12 ~ 16 行目では、先ほど作った関数 DBService.shared.updateStudent() に student1 を渡してデータを更新しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これを実行して、データの更新が成功すると、デバッガーのアウトプットコンソールに次のように表示されます。&lt;br&gt;&lt;br&gt;Opened connection to database&lt;br&gt;Update success&lt;br&gt;Swift - SQLite でデータを更新 (UPDATE) 2&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターで実行して、DB Browser for SQLite でできた SQLite のファイルを開いて確認してみます。&lt;br&gt;&lt;br&gt;DB Browser for SQLite についてと SQLite のファイルの場所の確認方法は、後ほど別の記事でご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルに入っていたデータが更新されています。&lt;br&gt;&lt;br&gt;Swift で SQLite のテーブルを作成する 4&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift - SQLite でデータを更新 (UPDATE) 3&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で SQLite のテーブルのデータを更新する方法をご説明しました。&lt;br&gt;&lt;br&gt;次は Swift で SQLite のデータを削除します。</description><pubDate>Sun, 28 Aug 2022 05:43:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift - SQLite でデータを挿入 (INSERT)</title><link>https://softmoco.com/sqlite/swift-sqlite-insert.php</link><description>Swift - SQLite でデータを挿入 (INSERT)&lt;br&gt;&lt;br&gt;ここでは、Swift で SQLite のテーブルにデータを挿入する方法をご説明します。&lt;br&gt;&lt;br&gt;「Swift で SQLite のテーブルを作成する」のコードに、SQLite でデータを挿入するコードを追加します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;students テーブルにデータを挿入する関数を定義する&lt;br&gt;students テーブルにデータを挿入する&lt;br&gt;students テーブルにデータを挿入する関数を定義する&lt;br&gt;前回は次のような Student 構造体のデータを保持する SQLite の students テーブルを作成しました。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var StudentID: Int&lt;br&gt;    var StudentNumber: String&lt;br&gt;    var FirstName: String&lt;br&gt;    var LastName: String&lt;br&gt;    var Age: Int?&lt;br&gt;    &lt;br&gt;    init(studentID: Int, studentNumber: String, firstName: String, lastName: String, age: Int?) {&lt;br&gt;        self.StudentID = studentID&lt;br&gt;        self.StudentNumber = studentNumber&lt;br&gt;        self.FirstName = firstName&lt;br&gt;        self.LastName = lastName&lt;br&gt;        self.Age = age&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;CREATE TABLE IF NOT EXISTS students (&lt;br&gt;    student_id INTEGER NOT NULL PRIMARY KEY,&lt;br&gt;    student_number TEXT NOT NULL,&lt;br&gt;    first_name TEXT NULL,&lt;br&gt;    last_name TEXT NULL,&lt;br&gt;    age INTEGER NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;&lt;br&gt;まずは、Student オブジェクトを受け取り、students テーブルにデータを挿入する insertStudent 関数を作ります。&lt;br&gt;&lt;br&gt;DBService.swift ファイルを開き以下のコードを追加してください。&lt;br&gt;&lt;br&gt;func insertStudent(student: Student) -&gt; Bool {&lt;br&gt;    let insertSql = &quot;&quot;&quot;&lt;br&gt;                    INSERT INTO students&lt;br&gt;                        (student_id, student_number, first_name, last_name, age)&lt;br&gt;                        VALUES&lt;br&gt;                        (?, ?, ?, ?, ?);&lt;br&gt;                    &quot;&quot;&quot;;&lt;br&gt;    var insertStmt: OpaquePointer? = nil&lt;br&gt;    &lt;br&gt;    if sqlite3_prepare_v2(db, (insertSql as NSString).utf8String, -1, &amp;insertStmt, nil) != SQLITE_OK {&lt;br&gt;        print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;        return false&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    sqlite3_bind_int(insertStmt, 1,Int32(student.StudentID))&lt;br&gt;    sqlite3_bind_text(insertStmt, 2, (student.StudentNumber as NSString).utf8String, -1, nil)&lt;br&gt;    sqlite3_bind_text(insertStmt, 3, (student.FirstName as NSString).utf8String, -1, nil)&lt;br&gt;    sqlite3_bind_text(insertStmt, 4, (student.LastName as NSString).utf8String, -1, nil)&lt;br&gt;    &lt;br&gt;    if student.Age == nil {&lt;br&gt;        sqlite3_bind_null(insertStmt, 5)&lt;br&gt;    } else {&lt;br&gt;        sqlite3_bind_int(insertStmt, 5, Int32(student.Age!))&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    if sqlite3_step(insertStmt) != SQLITE_DONE {&lt;br&gt;        print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;        sqlite3_finalize(insertStmt)&lt;br&gt;        return false&lt;br&gt;    }&lt;br&gt;    sqlite3_finalize(insertStmt)&lt;br&gt;    return true&lt;br&gt;}&lt;br&gt;Swift で SQLite のテーブルを作成する 1&lt;br&gt;&lt;br&gt;insertStudent 関数のコードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;まず、2 ~ 7 行目で、SQLite の INSERT 文のスクリプトを insertSql に定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite で SQL 文を実行するには、その前にステートメントを準備用の関数をつかって、バイトコードプログラムにコンパイルする必要があります。&lt;br&gt;&lt;br&gt;ここでは、sqlite3_prepare_v2() 関数を使って SQL 文をコンパイルしています。&lt;br&gt;&lt;br&gt;int sqlite3_prepare_v2(&lt;br&gt;  sqlite3 *db,            /* Database handle */&lt;br&gt;  const char *zSql,       /* SQL statement, UTF-8 encoded */&lt;br&gt;  int nByte,              /* Maximum length of zSql in bytes. */&lt;br&gt;  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */&lt;br&gt;  const char **pzTail     /* OUT: Pointer to unused portion of zSql */&lt;br&gt;);&lt;br&gt;&lt;br&gt;8 行目で、sqlite3_prepare_v2() 関数に渡すステートメントハンドル用の OpaquePointer? 型の変数の insertStmt を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;10 行目で、sqlite3_prepare_v2() 関数に、データベースを開いた時に取得した db ハンドル、insertSql を UTF-8 に変換した文字列、上で定義した &amp;insertStmt などを渡して実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;sqlite3_prepare_v2() 関数 は成功したら SQLITE_OK を返し、失敗するとエラーコードを返します。&lt;br&gt;&lt;br&gt;失敗した時には getDBErrorMessage() 関数を使ってエラーコードをプリントし、false を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;15 ~ 24 行目では、上で準備したステートメントに、値をバインドしています。&lt;br&gt;&lt;br&gt;文字列をバインドするには sqlite3_bind_text()、整数をバインドするには sqlite3_bind_int() のようにデータ型によって違う関数を使います。&lt;br&gt;&lt;br&gt;15 行目では sqlite3_bind_int() を使って、insertSql 文のひとつめの ? に student.StudentID を Int32 に変換してバインドしています。&lt;br&gt;&lt;br&gt;16 行目では sqlite3_bind_text() を使って、insertSql 文の二つ目の ? に student.StudentNumber を UTF-8 に変換してバインドしています。&lt;br&gt;&lt;br&gt;同様に 17、18 行目では sqlite3_bind_text() を使って、三つ目と四つ目の ? に student.FirstName と student.LastName をバインドしています。&lt;br&gt;&lt;br&gt;20 ~ 24 行目では、五つ目の ? に student.Age が null の時は sqlite3_bind_null() を使って null をバインドして、null 出ない時は sqlite3_bind_int() を使って student.Age をバインドしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;26 ~ 30 行目では、sqlite3_step() 関数を使って、コンパイルした SQL文を評価して実行しています。&lt;br&gt;&lt;br&gt;sqlite3_step() 関数は成功すると SQLITE_DONE を返します。&lt;br&gt;&lt;br&gt;失敗した時は getDBErrorMessage() 関数を使ってエラーコードをプリントしています。&lt;br&gt;&lt;br&gt;return する前に、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;31 ~ 32 行目で、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy してから true を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルにデータを挿入する&lt;br&gt;それでは、作った insertStudent() 関数を使って、データを挿入してみます。&lt;br&gt;&lt;br&gt;ViewController.swift の viewDidLoad() に以下のコードを追加してください。&lt;br&gt;&lt;br&gt;let student1 = Student(studentID: 1, studentNumber: &quot;S000001&quot;, firstName: &quot;Yuta&quot;, lastName: &quot;Tanaka&quot;, age: 16)&lt;br&gt;        &lt;br&gt;if DBService.shared.insertStudent(student: student1) {&lt;br&gt;    print(&quot;Insert success&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;Insert Failed&quot;)&lt;br&gt;}&lt;br&gt;1 行目で student1 という Student 型のオブジェクトを生成しています。&lt;br&gt;&lt;br&gt;3 ~ 7 行目では、先ほど作った関数 DBService.shared.insertStudent() に student1 を渡してデータを挿入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これを実行して、データの挿入が成功すると、デバッガーのアウトプットコンソールに次のように表示されます。&lt;br&gt;&lt;br&gt;Opened connection to database&lt;br&gt;Insert success&lt;br&gt;Swift で SQLite のテーブルを作成する 2&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターで実行して、DB Browser for SQLite でできた SQLite のファイルを開いて確認してみます。&lt;br&gt;&lt;br&gt;DB Browser for SQLite についてと SQLite のファイルの場所の確認方法は、後ほど別の記事でご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;students テーブルができていて、データが一行挿入されています。&lt;br&gt;&lt;br&gt;Swift で SQLite のテーブルを作成する 3&lt;br&gt;&lt;br&gt;Swift で SQLite のテーブルを作成する 4&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で SQLite のテーブルにデータを挿入する方法をご説明しました。&lt;br&gt;&lt;br&gt;次は Swift で SQLite のデータを更新します。</description><pubDate>Sat, 20 Aug 2022 06:59:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift で配列からカンマ区切りの文字列を生成する方法</title><link>https://softmoco.com/swift/swift-how-to-create-csv-from-array.php</link><description>Swift で配列からカンマ区切りの文字列を生成する方法&lt;br&gt;&lt;br&gt;ここでは Swift で配列からカンマ区切りの文字列を生成する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift で文字列の配列からカンマ区切りの文字列を生成する&lt;br&gt;Swift で数値の配列からカンマ区切りの文字列を生成する&lt;br&gt;Swift でオブジェクトの配列からプロパティのカンマ区切りの文字列を生成する&lt;br&gt;Swift で文字列の配列からカンマ区切りの文字列を生成する&lt;br&gt;Swift で文字列の配列からカンマ区切りの文字列を生成するには配列のメソッドの joined(separator:) 関数を使って生成することができます。&lt;br&gt;&lt;br&gt;array.joined(separator:)&lt;br&gt;joined(separator:) 関数は配列の要素が String 型の時に使え、指定した separator をはさんで要素をつなげた、新しい文字列を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、joined(separator:) 関数を使って文字列の配列からカンマ区切りの文字列を生成してみましょう。&lt;br&gt;&lt;br&gt;次のような names という配列の要素をカンマ区切りでつなげた文字列を生成するには次のようにできます。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;let csv = names.joined(separator: &quot;,&quot;)&lt;br&gt;print(csv)&lt;br&gt;実行結果は次のようになり、カンマ区切りの文字列が csv に代入されているのがわかります。&lt;br&gt;&lt;br&gt;Tanaka,Suzuki,Sato,Yamada&lt;br&gt;Swift で配列からカンマ区切りの文字列を生成する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で数値の配列からカンマ区切りの文字列を生成する&lt;br&gt;Swift で数値の配列からカンマ区切りの文字列を生成するには、まず数値の配列を文字列の配列に変換する必要があります。&lt;br&gt;&lt;br&gt;要素の型の変換するには map 関数が使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような ids という整数の配列の要素を、カンマ区切りでつなげた文字列を生成するには次のようにできます。&lt;br&gt;&lt;br&gt;let ids = [15, 6, 7, 12, 8, 1]&lt;br&gt;let idsString = ids.map { String($0) }&lt;br&gt;&lt;br&gt;let csv = idsString.joined(separator: &quot;,&quot;)&lt;br&gt;print(csv)&lt;br&gt;二行目で map 関数を使って、要素を文字列に変換した配列を生成し、idsString に代入しています。&lt;br&gt;&lt;br&gt;生成した文字列の配列から joined 関数を使ってカンマ区切りの文字列を生成しています。&lt;br&gt;&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;15,6,7,12,8,1&lt;br&gt;Swift で配列からカンマ区切りの文字列を生成する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でオブジェクトの配列からプロパティのカンマ区切りの文字列を生成する&lt;br&gt;最後に、Swift でオブジェクトの配列からプロパティのカンマ区切りの文字列を生成してみます。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような Student 構造体の配列の要素を、firstName,lastName,age のようにカンマ区切りの文字列に変換するには次のようにできます。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var lastName: String&lt;br&gt;    var firstName: String&lt;br&gt;    var age: Int&lt;br&gt;}&lt;br&gt;&lt;br&gt;let students = [&lt;br&gt;    Student(lastName: &quot;Tanaka&quot;, firstName: &quot;Yuka&quot;, age: 10),&lt;br&gt;    Student(lastName: &quot;Suzuki&quot;, firstName: &quot;Hiro&quot;, age: 9),&lt;br&gt;    Student(lastName: &quot;Sato&quot;, firstName: &quot;Kota&quot;, age: 8),&lt;br&gt;    Student(lastName: &quot;Yamada&quot;, firstName: &quot;Rio&quot;, age: 10),&lt;br&gt;    Student(lastName: &quot;Tanaka&quot;, firstName: &quot;Nana&quot;, age: 11)&lt;br&gt;]&lt;br&gt;&lt;br&gt;let studentCSV = students.map { &quot;\($0.firstName),\($0.lastName),\($0.age)&quot; }&lt;br&gt;let csv = studentCSV.joined(separator: &quot;\n&quot;)&lt;br&gt;print(csv)&lt;br&gt;15 行目で map 関数を使って、firstName,lastName,age の文字列を要素に持つ配列 studentCSV を生成しています。&lt;br&gt;&lt;br&gt;それを、16 行目で joined 関数の separator に改行文字の &quot;\n&quot; を指定してつなげています。&lt;br&gt;&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Yuka,Tanaka,10&lt;br&gt;Hiro,Suzuki,9&lt;br&gt;Kota,Sato,8&lt;br&gt;Rio,Yamada,10&lt;br&gt;Nana,Tanaka,11&lt;br&gt;Swift で配列からカンマ区切りの文字列を生成する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で配列からカンマ区切りの文字列を生成する方法についてご説明しました。</description><pubDate>Thu, 11 Aug 2022 05:06:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>Swift で SQLite のテーブルを作成する</title><link>https://softmoco.com/sqlite/swift-sqlite-create-table.php</link><description>Swift で SQLite のテーブルを作成する&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で SQLite のテーブルを作成する方法をご説明します。&lt;br&gt;&lt;br&gt;「Swift で SQLite データベースを作成して開く」のコードに、SQLite のテーブルを作成するコードを追加します。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような Student 構造体のデータを保持する SQLite のテーブルを作成します。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var StudentID: Int&lt;br&gt;    var StudentNumber: String&lt;br&gt;    var FirstName: String&lt;br&gt;    var LastName: String&lt;br&gt;    var Age: Int?&lt;br&gt;    &lt;br&gt;    init(studentID: Int, studentNumber: String, firstName: String, lastName: String, age: Int?) {&lt;br&gt;        self.StudentID = studentID&lt;br&gt;        self.StudentNumber = studentNumber&lt;br&gt;        self.FirstName = firstName&lt;br&gt;        self.LastName = lastName&lt;br&gt;        self.Age = age&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;メニューから File &gt; New &gt; File... で [iOS] の[Swift File] を選択し、Student.swift という名前でファイルを作成し、上のコードを追加しておきます。&lt;br&gt;&lt;br&gt;Swift で SQLite のテーブルを作成する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;「Swift で SQLite データベースを作成して開く」では、DBService クラスのイニシャライザーで SQLite のデータベースを作って開き、db ハンドルを取得しました。&lt;br&gt;&lt;br&gt;今回はその後に SQLite のテーブルを作成するコードを追加します。&lt;br&gt;&lt;br&gt;&lt;br&gt;DBService.swift ファイルを開き以下のコードを追加してください。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;import SQLite3&lt;br&gt;&lt;br&gt;final class DBService {&lt;br&gt;    static let shared = DBService()&lt;br&gt;    &lt;br&gt;    private let dbFile = &quot;DBVer1.sqlite&quot;&lt;br&gt;    private var db: OpaquePointer?&lt;br&gt;    &lt;br&gt;    private init() {&lt;br&gt;        db = openDatabase()&lt;br&gt;        if !createTable() {&lt;br&gt;            print(&quot;Failed to create table&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    private func openDatabase() -&gt; OpaquePointer? {&lt;br&gt;        let fileURL = try! FileManager.default.url(for: .documentDirectory,&lt;br&gt;                                                   in: .userDomainMask,&lt;br&gt;                                                   appropriateFor: nil,&lt;br&gt;                                                   create: false).appendingPathComponent(dbFile)&lt;br&gt;        &lt;br&gt;        var db: OpaquePointer? = nil&lt;br&gt;        if sqlite3_open(fileURL.path, &amp;db) != SQLITE_OK {&lt;br&gt;            print(&quot;Failed to open database&quot;)&lt;br&gt;            return nil&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Opened connection to database&quot;)&lt;br&gt;            return db&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    private func createTable() -&gt; Bool {&lt;br&gt;        let createSql = &quot;&quot;&quot;&lt;br&gt;        CREATE TABLE IF NOT EXISTS students (&lt;br&gt;            student_id INTEGER NOT NULL PRIMARY KEY,&lt;br&gt;            student_number TEXT NOT NULL,&lt;br&gt;            first_name TEXT NULL,&lt;br&gt;            last_name TEXT NULL,&lt;br&gt;            age INTEGER NULL&lt;br&gt;        );&lt;br&gt;        &quot;&quot;&quot;&lt;br&gt;        &lt;br&gt;        var createStmt: OpaquePointer? = nil&lt;br&gt;        &lt;br&gt;        if sqlite3_prepare_v2(db, (createSql as NSString).utf8String, -1, &amp;createStmt, nil) != SQLITE_OK {&lt;br&gt;            print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;            return false&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        if sqlite3_step(createStmt) != SQLITE_DONE {&lt;br&gt;            print(&quot;db error: \(getDBErrorMessage(db))&quot;)&lt;br&gt;            sqlite3_finalize(createStmt)&lt;br&gt;            return false&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        sqlite3_finalize(createStmt)&lt;br&gt;        return true&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    private func getDBErrorMessage(_ db: OpaquePointer?) -&gt; String {&lt;br&gt;        if let err = sqlite3_errmsg(db) {&lt;br&gt;            return String(cString: err)&lt;br&gt;        } else {&lt;br&gt;            return &quot;&quot;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;Swift で SQLite のテーブルを作成する 2&lt;br&gt;&lt;br&gt;コードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;12 行目のイニシャライザーの中で、createTable() 関数を呼んで、false を返した場合は、失敗したというメッセージをプリントしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;34 ~ 63 行目で createTable() 関数を定義しています。&lt;br&gt;&lt;br&gt;まず、35 ~ 43 行目で、SQLite の CREATE TABLE 文のスクリプトを createSql に定義しています。&lt;br&gt;&lt;br&gt;CREATE TABLE IF NOT EXISTS で、students テーブルが存在しない時のみテーブルを作成するようにしています。&lt;br&gt;&lt;br&gt;カラムは Student 構造体のあわせた名前と SQLite のデータ型を指定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite で SQL 文を実行するには、その前にステートメントを準備用の関数をつかって、バイトコードプログラムにコンパイルする必要があります。&lt;br&gt;&lt;br&gt;ここでは、sqlite3_prepare_v2() 関数を使って SQL 文をコンパイルしています。&lt;br&gt;&lt;br&gt;int sqlite3_prepare_v2(&lt;br&gt;  sqlite3 *db,            /* Database handle */&lt;br&gt;  const char *zSql,       /* SQL statement, UTF-8 encoded */&lt;br&gt;  int nByte,              /* Maximum length of zSql in bytes. */&lt;br&gt;  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */&lt;br&gt;  const char **pzTail     /* OUT: Pointer to unused portion of zSql */&lt;br&gt;);&lt;br&gt;&lt;br&gt;45 行目で、sqlite3_prepare_v2() 関数に渡すステートメントハンドル用の OpaquePointer? 型の変数の createStmt を定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;47 行目で、sqlite3_prepare_v2() 関数に、データベースを開いた時に取得した db ハンドル、SQL文を UTF-8 に変換した文字列、上で定義した &amp;createStmt などを渡して実行しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;sqlite3_prepare_v2() 関数 は成功したら SQLITE_OK を返し、失敗するとエラーコードを返します。&lt;br&gt;&lt;br&gt;失敗した時には getDBErrorMessage() 関数を使ってエラーコードをプリントし、false を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;先に 62 ~ 68 行目の getDBErrorMessage() 関数を説明します。&lt;br&gt;&lt;br&gt;エラーコードを取得するのに sqlite3_errmsg() 関数を使います。&lt;br&gt;&lt;br&gt;sqlite3_errmsg() 関数は db ハンドルを受け取り 最後に失敗した API コールのエラーメッセージを返す関数です。&lt;br&gt;&lt;br&gt;getDBErrorMessage() 関数では sqlite3_errmsg() 関数を使って、エラーメッセージを取得し、それを元に Swift の String を生成して返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;元に戻って、52 ~ 56 行目では、sqlite3_step() 関数を使って、コンパイルした SQL文を評価して実行しています。&lt;br&gt;&lt;br&gt;sqlite3_step() 関数は成功すると SQLITE_DONE を返します。&lt;br&gt;&lt;br&gt;失敗した時は getDBErrorMessage() 関数を使ってエラーコードをプリントしています。&lt;br&gt;&lt;br&gt;return する前に、sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;58 ~ 59 行目では、ステートメントの実行が成功した時にも sqlite3_finalize() 関数で、prepare したステートメントオブジェクトを destroy してから true を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で SQLite のテーブルを作成する方法をご説明しました。&lt;br&gt;&lt;br&gt;次は SQLite のテーブルにデータを挿入します。</description><pubDate>Fri, 05 Aug 2022 10:06:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift で SQLite データベースを作成して開く</title><link>https://softmoco.com/sqlite/swift-create-and-open-sqlite-database.php</link><description>Swift で SQLite データベースを作成して開く&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で SQLite データベースを作成して開く方法をご説明します。&lt;br&gt;&lt;br&gt;「SQLite テスト用の iOS アプリを作る」で作ったアプリにコード追加していきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite のデータベースを、存在しない場合は作成してから開くのに sqlite3_open() 関数を使います。&lt;br&gt;&lt;br&gt;DBService.swift ファイルを開き以下のコードを追加してください。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;import SQLite3&lt;br&gt;&lt;br&gt;final class DBService {&lt;br&gt;    static let shared = DBService()&lt;br&gt;    &lt;br&gt;    private let dbFile = &quot;DBVer1.sqlite&quot;&lt;br&gt;    private var db: OpaquePointer?&lt;br&gt;    &lt;br&gt;    private init() {&lt;br&gt;        db = openDatabase()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    private func openDatabase() -&gt; OpaquePointer? {&lt;br&gt;        let fileURL = try! FileManager.default.url(for: .documentDirectory,&lt;br&gt;                                                   in: .userDomainMask,&lt;br&gt;                                                   appropriateFor: nil,&lt;br&gt;                                                   create: false).appendingPathComponent(dbFile)&lt;br&gt;        &lt;br&gt;        var db: OpaquePointer? = nil&lt;br&gt;        if sqlite3_open(fileURL.path, &amp;db) != SQLITE_OK {&lt;br&gt;            print(&quot;Failed to open database&quot;)&lt;br&gt;            return nil&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Opened connection to database&quot;)&lt;br&gt;            return db&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;コードを順を追ってご説明します。&lt;br&gt;&lt;br&gt;7 行目は dbFile に SQLite のデータベースファイル名を定義して代入しています。&lt;br&gt;&lt;br&gt;今回は DBVer1.sqlite というファイル名にしました。&lt;br&gt;&lt;br&gt;&lt;br&gt;8 行目では、これから SQLite のデータベースを操作するのに使う db と言う名前の OpaquePointer 型の変数を定義しています。&lt;br&gt;&lt;br&gt;10 ~ 12 行目のイニシャライザーで、DBService クラスのインスタンスが生成される時に openDatabase() 関数を実行して、db に戻り値を代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;14 ~ 29 行目の openDatabase() 関数は SQLite データベースをなければ作成して開き、OpaquePointer を返す関数です。&lt;br&gt;&lt;br&gt;15 ~ 18 行目では、FileManager.default.url() で、ユーザーのホームディレクトリ内の documentDirectory の URL を取得し、それに SQLite のデータベースファイル名を追加したものを fileURL に代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;20 行目はローカルの db と言う名前の OpaquePointer? 型の変数を定義しています。&lt;br&gt;&lt;br&gt;21 行目で、sqlite3_open() 関数に先ほどの fileURL.path と db を引数として渡して、SQLite データベースを開いています。&lt;br&gt;&lt;br&gt;指定した path に SQLite データベースファイルが存在しない場合は、生成されてから開かれます。&lt;br&gt;&lt;br&gt;&lt;br&gt;データベースを開くのに成功したら、ポインターが db に設定され、sqlite3_open() 関数は SQLITE_OK を返します。&lt;br&gt;&lt;br&gt;22 ~ 23 行目では、データベースを開くのに失敗した時に、メッセージをプリントして nil を返しています。&lt;br&gt;&lt;br&gt;26 ~ 17 行目では、データベースを開くのに成功した時に、メッセージをプリントして db を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で SQLite データベースを作成して開く方法をご説明しました。&lt;br&gt;&lt;br&gt;次は SQLite データベース にテーブルを作成します。</description><pubDate>Wed, 03 Aug 2022 09:33:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>SQLite テスト用の iOS アプリを作る</title><link>https://softmoco.com/sqlite/create-test-ios-app-for-sqlite.php</link><description>SQLite テスト用の iOS アプリを作る&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、SQLite のテスト用の iOS アプリを作ります。&lt;br&gt;&lt;br&gt;今回は UI は作らず、SQLite のデータベースの生成と接続、テーブル作成、データの挿入、更新、削除、取得などを Xcode のデバッガを使って実行して確認していきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode を起動し、[iOS] の[App] でプロジェクトを作成します。&lt;br&gt;&lt;br&gt;SQLite テスト用の iOS アプリを作る 1&lt;br&gt;&lt;br&gt;&lt;br&gt;メニューから File &gt; New &gt; File... を選択します。&lt;br&gt;&lt;br&gt;SQLite テスト用の iOS アプリを作る 2&lt;br&gt;&lt;br&gt;&lt;br&gt;[iOS] の[Swift File] を選択します。&lt;br&gt;&lt;br&gt;SQLite テスト用の iOS アプリを作る 3&lt;br&gt;&lt;br&gt;&lt;br&gt;DBService.swift という名前でファイルを作成しました。&lt;br&gt;&lt;br&gt;SQLite テスト用の iOS アプリを作る 4&lt;br&gt;&lt;br&gt;&lt;br&gt;DBService.swift を開いて、以下のコードを追加しておきます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;import SQLite3&lt;br&gt;&lt;br&gt;final class DBService {&lt;br&gt;    static let shared = DBService()&lt;br&gt;    &lt;br&gt;}&lt;br&gt;SQLite テスト用の iOS アプリを作る 5&lt;br&gt;&lt;br&gt;&lt;br&gt;この DBService クラスに SQLite のコードを書いてテストしていきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQLite のテスト用の iOS アプリを作りました。</description><pubDate>Sat, 30 Jul 2022 09:41:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>Swift - 配列から指定したプロパティの値を持つオブジェクトを抽出する方法</title><link>https://softmoco.com/swift/swift-how-to-get-an-object-by-property-value-from-array.php</link><description>Swift - 配列から指定したプロパティの値を持つオブジェクトを抽出する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift のオブジェクトの配列 (array) があって、ID などの値を指定して、その ID を持つオブジェクトを取得したいような時ありませんか？&lt;br&gt;&lt;br&gt;例えば、次のような Employee struct の配列 [Employee] があって、そのうち、employeeID = 3 の Employee オブジェクトを取得したいような時です。&lt;br&gt;&lt;br&gt;struct Employee {&lt;br&gt;    var employeeID: Int&lt;br&gt;    var firstName: String&lt;br&gt;    var lastName: String&lt;br&gt;}&lt;br&gt;今回は、配列内に条件に合致するオブジェクトかひとつだけ存在すると想定されるようなケースを想定しています。&lt;br&gt;&lt;br&gt;Swift オブジェクトの配列から、指定したプロパティの値を持つオブジェクトを抽出する方法についてご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の配列から指定したプロパティの値を持つオブジェクトを取得する方法&lt;br&gt;Swift で配列を ID などの値を指定してフィルターして、その ID を持つオブジェクトを取得したい時には、Array の first メソッドが使えます。&lt;br&gt;&lt;br&gt;使い方は Array.first(where: { 条件式 }) のように使います。&lt;br&gt;&lt;br&gt;first メソッドは条件式に合致する最初の要素を返し、条件に合う要素がない場合は nil を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の struct オブジェクトの配列に対して、指定した ID を持つオブジェクトを取得するサンプルーコードは次の通りです。&lt;br&gt;&lt;br&gt;struct Employee {&lt;br&gt;    var employeeID: Int&lt;br&gt;    var firstName: String&lt;br&gt;    var lastName: String&lt;br&gt;}&lt;br&gt;&lt;br&gt;var employees: [Employee] = []&lt;br&gt;employees.append(Employee(employeeID: 1, firstName: &quot;Saki&quot;, lastName: &quot;Yamada&quot;))&lt;br&gt;employees.append(Employee(employeeID: 2, firstName: &quot;Akira&quot;, lastName: &quot;Tanaka&quot;))&lt;br&gt;employees.append(Employee(employeeID: 3, firstName: &quot;Ryo&quot;, lastName: &quot;Suzuki&quot;))&lt;br&gt;employees.append(Employee(employeeID: 4, firstName: &quot;Keita&quot;, lastName: &quot;Sato&quot;))&lt;br&gt;employees.append(Employee(employeeID: 5, firstName: &quot;Yuki&quot;, lastName: &quot;Nishida&quot;))&lt;br&gt;&lt;br&gt;if let emp = employees.first(where: { $0.employeeID == 3 }) {&lt;br&gt;    print(emp.employeeID, emp.firstName, emp.lastName)&lt;br&gt;} else {&lt;br&gt;    print(&quot;Not found&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;7 ~ 12 行目は Employee struct のオブジェクトを持つ配列を生成しています。&lt;br&gt;&lt;br&gt;14 行目で、if let で Array の first メソッドを使って、employees の中から、employeeID が 3 の Employee オブジェクトを取得しています。&lt;br&gt;&lt;br&gt;$0 は closure のひとつめの引数を示しています。 $0 は Employee 型の引数ですので、employeeID が 3 の時に True になるように $0.employeeID == 3 と指定しています。&lt;br&gt;&lt;br&gt;条件に合致する Employee オブジェクトが見つかった場合は、employeeID、firstName、lastName が print され、みつからなかった場合は Not found と print されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;上のコードを実行すると次のようになります。&lt;br&gt;&lt;br&gt;3 Ryo Suzuki&lt;br&gt;Swift - 配列から指定したプロパティの値を持つオブジェクトを抽出する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;employeeID が 3 の employeeID、firstName、lastName が print されています。&lt;br&gt;&lt;br&gt;14 行目 を $0.employeeID == 6 に変更して実行すると、Not found と print されました。&lt;br&gt;&lt;br&gt;Swift - 配列から指定したプロパティの値を持つオブジェクトを抽出する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の配列から指定したプロパティの値を持つオブジェクトを取得する方法をご説明しました。</description><pubDate>Thu, 26 May 2022 00:35:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>Swift で UITextField が空かどうか判定する</title><link>https://softmoco.com/swift/swift-check-if-uitextfield-is-empty.php</link><description>Swift で UITextField が空かどうか判定する&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS のアプリを開発していると、UITextField が空かどうか判定したい時があると思います。&lt;br&gt;&lt;br&gt;UITextField が空かどうか判定する方法は、いろいろやりようがあると思います。&lt;br&gt;&lt;br&gt;ここでは Swift で TextField が空っぽかどうか判定する方法のひとつをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;TextField が空かどうか判定する&lt;br&gt;UITextField のアウトレットが textField という名前で定義されているとします。&lt;br&gt;&lt;br&gt;この textField が空っぽかどうか判断したい時は次のようにできます。&lt;br&gt;&lt;br&gt;if textField.text?.isEmpty ?? true {&lt;br&gt;    print(&quot;textField は空です。&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;textField は空ではありません。&quot;)&lt;br&gt;}&lt;br&gt;textField.text の後の ? 演算子は Swift の Optional Chaining です。&lt;br&gt;&lt;br&gt;? を Optional の定数や変数の後ろにつけてから、プロパティやメソッドを呼び出した時に、値が nil の時は、続くプロパティやメソッドは実行されません。&lt;br&gt;&lt;br&gt;ここでは textField.text が nil でない時は isEmpty プロパティの値である、空っぽの時は true そうでない時は false が返ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;?? 演算子は Optional の値につづけて使い、Optional の値が nil の時のデフォルト値を指定することができます。&lt;br&gt;&lt;br&gt;ですので、textField.text が nil の時は true になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;意味的には以下のコードと同じです。&lt;br&gt;&lt;br&gt;if textField.text == nil || textField.text!.isEmpty {&lt;br&gt;    print(&quot;textField は空です。&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;textField は空ではありません。&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;繰り返し使う時は、以下のように関数を定義して使っても便利かもしれません。&lt;br&gt;&lt;br&gt;func isTextFieldEmpty(_: UITextField) -&gt; Bool{&lt;br&gt;    return textField.text?.isEmpty ?? true&lt;br&gt;}&lt;br&gt;if isTextFieldEmpty(textField) {&lt;br&gt;    print(&quot;textField は空です。&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;textField は空ではありません。&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;以上、Swift で TextField が空かどうか判定する方法をご紹介しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Wed, 18 May 2022 08:15:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>Swift で XMLParser を使って XML を読み込む方法</title><link>https://softmoco.com/swift/swift-how-to-parse-xml.php</link><description>Swift で XMLParser を使って XML を読み込む方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift で XMLParser を使って XML データを読み込む方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;サンプル XML 文字列と読み込む struct の定義&lt;br&gt;Swift の XMLParser とは？&lt;br&gt;XMLParser で XML 文字列を読み込む&lt;br&gt;サンプル XML 文字列と読み込む struct の定義&lt;br&gt;今回は XMLParser を使って、XML の文字列から Swift の struct のオブジェクに読み込む方法をご紹介します。&lt;br&gt;&lt;br&gt;次のような XML 文字列を読み込みます。&lt;br&gt;&lt;br&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;br&gt;&lt;Orders&gt;&lt;br&gt;  &lt;Order OrderNo=&quot;PO000001&quot;&gt;&lt;br&gt;    &lt;VendorName&gt;AAA Company&lt;/VendorName&gt;&lt;br&gt;    &lt;OrderDetails&gt;&lt;br&gt;      &lt;OrderDetail&gt;&lt;br&gt;        &lt;ItemName&gt;Item A&lt;/ItemName&gt;&lt;br&gt;        &lt;OrderQty&gt;10&lt;/OrderQty&gt;&lt;br&gt;      &lt;/OrderDetail&gt;&lt;br&gt;      &lt;OrderDetail&gt;&lt;br&gt;        &lt;ItemName&gt;Item B&lt;/ItemName&gt;&lt;br&gt;        &lt;OrderQty&gt;5&lt;/OrderQty&gt;&lt;br&gt;      &lt;/OrderDetail&gt;&lt;br&gt;    &lt;/OrderDetails&gt;&lt;br&gt;  &lt;/Order&gt;&lt;br&gt;  &lt;Order OrderNo=&quot;PO000002&quot;&gt;&lt;br&gt;    &lt;VendorName&gt;BBB Company&lt;/VendorName&gt;&lt;br&gt;    &lt;OrderDetails&gt;&lt;br&gt;      &lt;OrderDetail&gt;&lt;br&gt;        &lt;ItemName&gt;Item C&lt;/ItemName&gt;&lt;br&gt;        &lt;OrderQty&gt;3&lt;/OrderQty&gt;&lt;br&gt;      &lt;/OrderDetail&gt;&lt;br&gt;    &lt;/OrderDetails&gt;&lt;br&gt;  &lt;/Order&gt;&lt;br&gt;&lt;/Orders&gt;&lt;br&gt;&lt;br&gt;上の XML の情報を保持するための struct を次のように定義し、読み込んだデータを Order の配列に保存していきます。&lt;br&gt;&lt;br&gt;struct Order {&lt;br&gt;    var orderNo: String&lt;br&gt;    var vendorName: String&lt;br&gt;    var orderDetails: [OrderDetail]&lt;br&gt;}&lt;br&gt;&lt;br&gt;struct OrderDetail {&lt;br&gt;    var itemName: String&lt;br&gt;    var orderQty: Int?&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift の XMLParser とは？&lt;br&gt;今回は Swift で XMLParser を使って、XML 文字列を読み込みます。&lt;br&gt;&lt;br&gt;XMLParser はイベントドリブンのパーサーで XML ドキュメントを読み込みながらイベントを発生します。&lt;br&gt;&lt;br&gt;発生したイベント内でデータを保存していくのはこちらの仕事です。&lt;br&gt;&lt;br&gt;&lt;br&gt;XMLParserDelegate をコンフォームして XMLParser で parse() すると、XML を読み込みながら、データを取得するためのイベントを受け取ることができます。&lt;br&gt;&lt;br&gt;今回は以下の三つのメソッド使って、XML データから orders のデータを生成していきます。&lt;br&gt;&lt;br&gt;parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)&lt;br&gt;parser(_:foundCharacters:)&lt;br&gt;parser(_:didEndElement:namespaceURI:qualifiedName:)&lt;br&gt;一つ目はエレメントが始まった時に呼ばれるイベント、二つ目は現在のエレメント内で見つかった文字をお知らせするイベント、三つ目はエレメントが終わった時に呼ばれるイベントです。&lt;br&gt;&lt;br&gt;&lt;br&gt;XMLParser で XML 文字列を読み込む&lt;br&gt;それでは、Swift で XMLParser を使って、XML 文字列を読み込む方法をご説明します。&lt;br&gt;&lt;br&gt;Playground でもできますが、デバッグしにくいので、今回は iOS アプリの ViewController クラスを使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;XML 文字列を XMLParser を使って、Order struct の配列に読み込むには次のようにできます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;struct Order {&lt;br&gt;    var orderNo: String&lt;br&gt;    var vendorName: String&lt;br&gt;    var orderDetails: [OrderDetail]&lt;br&gt;}&lt;br&gt;&lt;br&gt;struct OrderDetail {&lt;br&gt;    var itemName: String&lt;br&gt;    var orderQty: Int?&lt;br&gt;}&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, XMLParserDelegate {&lt;br&gt;    &lt;br&gt;    var elementName: String = &quot;&quot;&lt;br&gt;    var orders: [Order] = []&lt;br&gt;    var orderNo: String = &quot;&quot;&lt;br&gt;    var vendorName: String = &quot;&quot;&lt;br&gt;    var orderDetails:[OrderDetail] = []&lt;br&gt;    var itemName: String = &quot;&quot;&lt;br&gt;    var orderQty: Int?&lt;br&gt;    &lt;br&gt;    let xmlString = &quot;&quot;&quot;&lt;br&gt;    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;br&gt;    &lt;Orders&gt;&lt;br&gt;    &lt;Order OrderNo=&quot;PO000001&quot;&gt;&lt;br&gt;        &lt;VendorName&gt;AAA Company&lt;/VendorName&gt;&lt;br&gt;        &lt;OrderDetails&gt;&lt;br&gt;        &lt;OrderDetail&gt;&lt;br&gt;            &lt;ItemName&gt;Item A&lt;/ItemName&gt;&lt;br&gt;            &lt;OrderQty&gt;10&lt;/OrderQty&gt;&lt;br&gt;        &lt;/OrderDetail&gt;&lt;br&gt;        &lt;OrderDetail&gt;&lt;br&gt;            &lt;ItemName&gt;Item B&lt;/ItemName&gt;&lt;br&gt;            &lt;OrderQty&gt;5&lt;/OrderQty&gt;&lt;br&gt;        &lt;/OrderDetail&gt;&lt;br&gt;        &lt;/OrderDetails&gt;&lt;br&gt;    &lt;/Order&gt;&lt;br&gt;    &lt;Order OrderNo=&quot;PO000002&quot;&gt;&lt;br&gt;        &lt;VendorName&gt;BBB Company&lt;/VendorName&gt;&lt;br&gt;        &lt;OrderDetails&gt;&lt;br&gt;        &lt;OrderDetail&gt;&lt;br&gt;            &lt;ItemName&gt;Item C&lt;/ItemName&gt;&lt;br&gt;            &lt;OrderQty&gt;3&lt;/OrderQty&gt;&lt;br&gt;        &lt;/OrderDetail&gt;&lt;br&gt;        &lt;/OrderDetails&gt;&lt;br&gt;    &lt;/Order&gt;&lt;br&gt;    &lt;/Orders&gt;&lt;br&gt;    &quot;&quot;&quot;&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        let parser = XMLParser(data: xmlString.data(using: .utf8)!)&lt;br&gt;        parser.delegate = self&lt;br&gt;        parser.parse()&lt;br&gt;        &lt;br&gt;        dump(orders)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {&lt;br&gt;        switch elementName {&lt;br&gt;        case &quot;Order&quot;:&lt;br&gt;            if let no = attributeDict[&quot;OrderNo&quot;] {&lt;br&gt;                orderNo = no&lt;br&gt;            } else {&lt;br&gt;                orderNo = &quot;&quot;&lt;br&gt;            }&lt;br&gt;            vendorName = &quot;&quot;&lt;br&gt;            orderDetails = []&lt;br&gt;        case &quot;OrderDetail&quot;:&lt;br&gt;            itemName = &quot;&quot;&lt;br&gt;            orderQty = nil&lt;br&gt;        default:&lt;br&gt;            break&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        self.elementName = elementName&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func parser(_ parser: XMLParser, foundCharacters string: String) {&lt;br&gt;        let value = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)&lt;br&gt;        if (!value.isEmpty) {&lt;br&gt;            switch self.elementName {&lt;br&gt;            case &quot;VendorName&quot;:&lt;br&gt;                vendorName = value&lt;br&gt;            case &quot;ItemName&quot;:&lt;br&gt;                itemName = value&lt;br&gt;            case &quot;OrderQty&quot;:&lt;br&gt;                if let qty = Int(value) {&lt;br&gt;                    orderQty = qty&lt;br&gt;                }&lt;br&gt;            default:&lt;br&gt;                break&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt; &lt;br&gt;    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {&lt;br&gt;        switch elementName {&lt;br&gt;        case &quot;Order&quot;:&lt;br&gt;            let o = Order(orderNo: orderNo, vendorName: vendorName, orderDetails: orderDetails)&lt;br&gt;            orders.append(o)&lt;br&gt;        case &quot;OrderDetail&quot;:&lt;br&gt;            let od = OrderDetail(itemName: itemName, orderQty: orderQty)&lt;br&gt;            orderDetails.append(od)&lt;br&gt;        default:&lt;br&gt;            break&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;実行すると output ウィンドウに次のように表示され、XML のデータが orders オブジェクトに読み込めているのがわかります。&lt;br&gt;&lt;br&gt;Swift で XMLParser を使って XML を読み込む方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;コードを順番にご説明していきます。&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, XMLParserDelegate {&lt;br&gt;    &lt;br&gt;    var elementName: String = &quot;&quot;&lt;br&gt;    var orders: [Order] = []&lt;br&gt;    var orderNo: String = &quot;&quot;&lt;br&gt;    var vendorName: String = &quot;&quot;&lt;br&gt;    var orderDetails:[OrderDetail] = []&lt;br&gt;    var itemName: String = &quot;&quot;&lt;br&gt;    var orderQty: Int?&lt;br&gt;14 行目では、ViewController クラスで XMLParserDelegate をコンフォームしています。&lt;br&gt;&lt;br&gt;16 ~ 22 行目では、XML データを保存していくのに必要な変数を定義しています。&lt;br&gt;&lt;br&gt;elementName には現在のエレメント名が入ります。最終的には orders に読み込んだ全てのデータが入ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;override func viewDidLoad() {&lt;br&gt;    super.viewDidLoad()&lt;br&gt;    &lt;br&gt;    let parser = XMLParser(data: xmlString.data(using: .utf8)!)&lt;br&gt;    parser.delegate = self&lt;br&gt;    parser.parse()&lt;br&gt;&lt;br&gt;    dump(orders)&lt;br&gt;}&lt;br&gt;iOS アプリを実行した時に、viewDidLoad() が実行されます。&lt;br&gt;&lt;br&gt;55 行目で XML 文字列から Data を生成して指定して XMLParser を生成しています。&lt;br&gt;&lt;br&gt;今回は data を指定して XMLParser を生成しましたが、XMLParser(contentsOf url: URL) で ドキュメントの URL を指定して XML ファイルから XMLParser を生成することも可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;56 行目で parser.delegate = self として、このクラスで XMLParser が起こすイベントを受けとれるようにしています。&lt;br&gt;&lt;br&gt;57 行目の parse() でパースを実行しています。&lt;br&gt;&lt;br&gt;59 行目でパースした結果の orders オブジェクトの中身を output ウィンドウに dump しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {&lt;br&gt;    switch elementName {&lt;br&gt;    case &quot;Order&quot;:&lt;br&gt;        if let no = attributeDict[&quot;OrderNo&quot;] {&lt;br&gt;            orderNo = no&lt;br&gt;        } else {&lt;br&gt;            orderNo = &quot;&quot;&lt;br&gt;        }&lt;br&gt;        vendorName = &quot;&quot;&lt;br&gt;        orderDetails = []&lt;br&gt;    case &quot;OrderDetail&quot;:&lt;br&gt;        itemName = &quot;&quot;&lt;br&gt;        orderQty = nil&lt;br&gt;    default:&lt;br&gt;        break&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    self.elementName = elementName&lt;br&gt;}&lt;br&gt;parser(_:didStartElement:namespaceURI:qualifiedName:attributes:) はエレメントが始まった時に呼ばれるイベントです。&lt;br&gt;&lt;br&gt;Order エレメントと OrderDetail エレメントが開始した時に、それぞれ情報を保持する変数をリセットしています。&lt;br&gt;&lt;br&gt;アトリビュートの値を取得したい時は、65 行目のようにして、attributeDict にアトリビュート名を指定して取得できます。&lt;br&gt;&lt;br&gt;79 行目で 現在の elementName を self.elementName に保持するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;func parser(_ parser: XMLParser, foundCharacters string: String) {&lt;br&gt;    let value = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)&lt;br&gt;    if (!value.isEmpty) {&lt;br&gt;        switch self.elementName {&lt;br&gt;        case &quot;VendorName&quot;:&lt;br&gt;            vendorName = value&lt;br&gt;        case &quot;ItemName&quot;:&lt;br&gt;            itemName = value&lt;br&gt;        case &quot;OrderQty&quot;:&lt;br&gt;            if let qty = Int(value) {&lt;br&gt;                orderQty = qty&lt;br&gt;            }&lt;br&gt;        default:&lt;br&gt;            break&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;parser(_:foundCharacters:) は現在のエレメント内で見つかった文字をお知らせするイベントです。&lt;br&gt;&lt;br&gt;83 行目では、みつかった文字列から空白と改行をトリムしています。&lt;br&gt;&lt;br&gt;84 行目で文字列が空でない時のみ、switch 文を実行するようにしています。&lt;br&gt;&lt;br&gt;現在のエレメント名が VendorName、ItemName、OrderQty だった時に、値をそれぞれ vendorName、itemName、orderQty に代入しています。&lt;br&gt;&lt;br&gt;OrderQty のみ、値が整数の時のみ orderQty に代入するようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {&lt;br&gt;    switch elementName {&lt;br&gt;    case &quot;Order&quot;:&lt;br&gt;        let o = Order(orderNo: orderNo, vendorName: vendorName, orderDetails: orderDetails)&lt;br&gt;        orders.append(o)&lt;br&gt;    case &quot;OrderDetail&quot;:&lt;br&gt;        let od = OrderDetail(itemName: itemName, orderQty: orderQty)&lt;br&gt;        orderDetails.append(od)&lt;br&gt;    default:&lt;br&gt;        break&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;parser(_:didEndElement:namespaceURI:qualifiedName:) はエレメントが終わった時に呼ばれるイベントです。&lt;br&gt;&lt;br&gt;終わったエレメント名が Order か OrderDetail の時は、変数に保持されている値を元に Order と OrderDetail オブジェクトを生成し、それぞれ orders 配列、orderDetails 配列に append しています。&lt;br&gt;&lt;br&gt;これで、パースが終わった時に XML のデータが orders に読み込まれているはずです。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で XMLParser を使って XML データを読み込む方法についてご説明しました。</description><pubDate>Sat, 14 May 2022 00:35:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>Swift - multipart/form-data で画像ファイルを POST する方法</title><link>https://softmoco.com/basics/swift-how-to-post-image-using-multipart-form-data.php</link><description>Swift - multipart/form-data で画像ファイルを POST する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で Content-Type: multipart/form-data で画像ファイルを POST する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;multipart/form-data で POST されるデータ形式について&lt;br&gt;Swift で multipart/form-data で画像ファイルをPOST する方法&lt;br&gt;multipart/form-data で POST されるデータ形式について&lt;br&gt;Swift で multipart/form-data のデータをポストする前に、マルチパート形式で POST されるデータを確認します。&lt;br&gt;&lt;br&gt;次のような簡単なフォームから Item の情報をポストします。&lt;br&gt;&lt;br&gt;* form の acton の URL はダミーです。実際にポストはできません。&lt;br&gt;&lt;br&gt;&lt;form method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot; action=&quot;http://xxx.com/Test/SaveItemMultipart&quot;&gt;&lt;br&gt;    &lt;input name=&quot;itemID&quot;&gt;&lt;br&gt;    &lt;input name=&quot;itemName&quot;&gt;&lt;br&gt;    &lt;input type=&quot;file&quot; name=&quot;imageFile&quot;&gt;&lt;br&gt;    &lt;input type=&quot;submit&quot; value=&quot;Submit&quot;&gt;&lt;br&gt;&lt;/form&gt;&lt;br&gt;Swift - multipart/form-data で画像ファイルを POST する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;サーバー側では受け取った itemID, itemName, 画像ファイルを保存し、成功した場合は以下のようなレスポンスを返します。&lt;br&gt;&lt;br&gt;&lt;SaveItemResponse&gt;&lt;br&gt;    &lt;Message/&gt;&lt;br&gt;    &lt;Success&gt;true&lt;/Success&gt;&lt;br&gt;&lt;/SaveItemResponse&gt;&lt;br&gt;&lt;br&gt;フォームで、Submit した時のデータをキャプチャーしてみてみると、次のような感じになっています。&lt;br&gt;&lt;br&gt;Swift - multipart/form-data で画像ファイルを POST する方法 2&lt;br&gt;&lt;br&gt;Content-Type は multipart/form-data になっています。&lt;br&gt;&lt;br&gt;boundary として ----WebKitFormBoundaryZwEFFOVFw0vcvPuS が定義されていて、フォームデータを区切っています。&lt;br&gt;&lt;br&gt;フォームデータがシンプルなテキストのキー・バリューペアの場合は、--boundary改行の後に、Content-Disposition: form-data; name=&quot;キー名&quot;がきて、改行、改行に続けて値がきています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;フォームデータがファイルの時には、--boundary改行の後に、Content-Disposition: form-data; name=&quot;キー名&quot;; に続けて filename=&quot;ファイル名&quot; があり、改行がきて、Content-Type: 今回の場合は image/jpeg、改行、改行の後に、画像のバイナリデータが入ります。&lt;br&gt;&lt;br&gt;この画像では見えていませんが、画像のバイナリデータの後に終わりを示す --boundary--改行 があります。&lt;br&gt;&lt;br&gt;このようなデータが POST されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で multipart/form-data で画像ファイルをPOST する方法&lt;br&gt;Swift で multipart/form-data で画像ファイルを POST するために、先ほど確認したようなデータを生成します。&lt;br&gt;&lt;br&gt;ここでは multipart/form-data で画像ファイルを POST する箇所のコードだけをご説明します。&lt;br&gt;&lt;br&gt;imageView という UIImageView に表示されている jpeg の画像を sendToServerTapped のアクションで POST する前提です。&lt;br&gt;&lt;br&gt;@IBAction func sendToServerTapped(_ sender: Any) {&lt;br&gt;    guard let image = imageView.image else { return }&lt;br&gt;    guard let imageData = image.jpegData(compressionQuality: 1) else { return }&lt;br&gt;&lt;br&gt;    let itemID = 555&lt;br&gt;    let itemName = &quot;Item Name 555&quot;&lt;br&gt;    let imageFileName = &quot;itemp555.jpg&quot;&lt;br&gt;    &lt;br&gt;    let boundary = &quot;----------&quot; + UUID().uuidString&lt;br&gt;    &lt;br&gt;    var httpBody1 = &quot;--\(boundary)\r\n&quot;&lt;br&gt;    httpBody1 += &quot;Content-Disposition: form-data; name=\&quot;ItemID\&quot;\r\n&quot;&lt;br&gt;    httpBody1 += &quot;\r\n&quot;&lt;br&gt;    httpBody1 += &quot;\(itemID)\r\n&quot;&lt;br&gt;    httpBody1 += &quot;--\(boundary)\r\n&quot;&lt;br&gt;    httpBody1 += &quot;Content-Disposition: form-data; name=\&quot;ItemName\&quot;\r\n&quot;&lt;br&gt;    httpBody1 += &quot;\r\n&quot;&lt;br&gt;    httpBody1 += &quot;\(itemName)\r\n&quot;&lt;br&gt;    httpBody1 += &quot;--\(boundary)\r\n&quot;&lt;br&gt;    httpBody1 += &quot;Content-Disposition: form-data; name=\&quot;imageFile\&quot;; filename=\&quot;\(imageFileName)\&quot;\r\n&quot;&lt;br&gt;    httpBody1 += &quot;Content-Type: image/jpeg\r\n&quot;&lt;br&gt;    httpBody1 += &quot;\r\n&quot;&lt;br&gt;    &lt;br&gt;    var httpBody = Data()&lt;br&gt;    httpBody.append(httpBody1.data(using: .utf8)!)&lt;br&gt;    httpBody.append(imageData)&lt;br&gt;    &lt;br&gt;    var httpBody2 = &quot;\r\n&quot;&lt;br&gt;    httpBody2 += &quot;--\(boundary)--\r\n&quot;&lt;br&gt;&lt;br&gt;    httpBody.append(httpBody2.data(using: .utf8)!)&lt;br&gt;    &lt;br&gt;    let url = URL(string: &quot;http://xxx.com/Test/SaveItemMultipart&quot;)!&lt;br&gt;    var request = URLRequest(url: url)&lt;br&gt;    request.httpMethod = &quot;POST&quot;&lt;br&gt;    request.setValue(&quot;multipart/form-data; boundary=\(boundary)&quot;, forHTTPHeaderField: &quot;Content-Type&quot;)&lt;br&gt;    request.setValue(&quot;\(httpBody.count)&quot;, forHTTPHeaderField: &quot;Content-Length&quot;)&lt;br&gt;    request.httpBody = httpBody&lt;br&gt;    &lt;br&gt;    URLSession.shared.dataTask(with: request) {(data, response, error) in&lt;br&gt;        &lt;br&gt;        if let error = error {&lt;br&gt;            if let err = error as? URLError, err.code == URLError.Code.notConnectedToInternet {&lt;br&gt;                print(&quot;Internet connection not available. Please try again when internet connection is available.&quot;)&lt;br&gt;            } else {&lt;br&gt;                print(&quot;Unexpected error: \(error.localizedDescription).&quot;)&lt;br&gt;            }&lt;br&gt;            return;&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        if let response = response as? HTTPURLResponse {&lt;br&gt;            if !(200...299).contains(response.statusCode) {&lt;br&gt;                print(&quot;Request Failed - Status Code: \(response.statusCode).&quot;)&lt;br&gt;                return&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        if let data = data {&lt;br&gt;            do {&lt;br&gt;                let jsonDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]&lt;br&gt;                &lt;br&gt;                let success = jsonDict![&quot;Success&quot;] as! Bool&lt;br&gt;                let message = jsonDict![&quot;Message&quot;] as! String&lt;br&gt;                &lt;br&gt;                if(success) {&lt;br&gt;                    print(&quot;success&quot;)&lt;br&gt;                }&lt;br&gt;                else {&lt;br&gt;                    print(message)&lt;br&gt;                    return&lt;br&gt;                }&lt;br&gt;            &lt;br&gt;            } catch {&lt;br&gt;                print(&quot;Error parsing the response.&quot;)&lt;br&gt;            }&lt;br&gt;        } else {&lt;br&gt;            print(&quot;Unexpected error.&quot;)&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;    }.resume()&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift で multipart/form-data のデータをポストするコードを順番にご説明します。&lt;br&gt;&lt;br&gt;guard let image = imageView.image else { return }&lt;br&gt;guard let imageData = image.jpegData(compressionQuality: 1) else { return }&lt;br&gt;&lt;br&gt;let itemID = 555&lt;br&gt;let itemName = &quot;Item Name 555&quot;&lt;br&gt;let imageFileName = &quot;itemp555.jpg&quot;&lt;br&gt;2 行目では UIImageView の UIImage を image に代入しています。&lt;br&gt;&lt;br&gt;3 行目では UIImage から jpegData で JPEG の Data に変換して imageData に代入しています。&lt;br&gt;&lt;br&gt;5 ~ 7 行目はフォームデータの値とファイル名をハードコードで定義しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;let boundary = &quot;----------&quot; + UUID().uuidString&lt;br&gt;    &lt;br&gt;var httpBody1 = &quot;--\(boundary)\r\n&quot;&lt;br&gt;httpBody1 += &quot;Content-Disposition: form-data; name=\&quot;ItemID\&quot;\r\n&quot;&lt;br&gt;httpBody1 += &quot;\r\n&quot;&lt;br&gt;httpBody1 += &quot;\(itemID)\r\n&quot;&lt;br&gt;httpBody1 += &quot;--\(boundary)\r\n&quot;&lt;br&gt;httpBody1 += &quot;Content-Disposition: form-data; name=\&quot;ItemName\&quot;\r\n&quot;&lt;br&gt;httpBody1 += &quot;\r\n&quot;&lt;br&gt;httpBody1 += &quot;\(itemName)\r\n&quot;&lt;br&gt;httpBody1 += &quot;--\(boundary)\r\n&quot;&lt;br&gt;httpBody1 += &quot;Content-Disposition: form-data; name=\&quot;imageFile\&quot;; filename=\&quot;\(imageFileName)\&quot;\r\n&quot;&lt;br&gt;httpBody1 += &quot;Content-Type: image/jpeg\r\n&quot;&lt;br&gt;httpBody1 += &quot;\r\n&quot;&lt;br&gt;9 行目では boundary に使う文字列を UUID を使って生成しています。&lt;br&gt;&lt;br&gt;--boundary で区切って、httpBody1 という文字列にフォームデータを追加していきます。&lt;br&gt;&lt;br&gt;12 行目 ~ 14 行目では ItemID のフォームデータを先ほど確認した形式で httpBody1 に追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;16 行目 ~ 18 行目では ItemName のフォームデータを先ほど確認した形式で httpBody1 に追加しています。&lt;br&gt;&lt;br&gt;20 行目 ~ 22 行目では、画像ファイルのフォームデータの、バイナリデータの直前までを先ほど確認した形式で httpBody1 に追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;var httpBody = Data()&lt;br&gt;httpBody.append(httpBody1.data(using: .utf8)!)&lt;br&gt;httpBody.append(imageData)&lt;br&gt;&lt;br&gt;var httpBody2 = &quot;\r\n&quot;&lt;br&gt;httpBody2 += &quot;--\(boundary)--\r\n&quot;&lt;br&gt;&lt;br&gt;httpBody.append(httpBody2.data(using: .utf8)!)&lt;br&gt;24 行目 ~ 26 行目では、httpBody という Data 型の変数を定義し、そこに httpBody1 を Data に変換して append し、づづけて、JPEG の imageData を append しています。&lt;br&gt;&lt;br&gt;28 行目 ~ 29 行目では、バイナリデータの後に続く改行と最後を表す --boundary--改行を httpBody2 に生成しています。&lt;br&gt;&lt;br&gt;31 行目で httpBody に httpBody2 を Data に変換して append しています。&lt;br&gt;&lt;br&gt;これで、httpBody に POST したいデータをマルチパート形式で生成することができました。&lt;br&gt;&lt;br&gt;&lt;br&gt;let url = URL(string: &quot;http://xxx.com/Test/SaveItemMultipart&quot;)!&lt;br&gt;var request = URLRequest(url: url)&lt;br&gt;request.httpMethod = &quot;POST&quot;&lt;br&gt;request.setValue(&quot;multipart/form-data; boundary=\(boundary)&quot;, forHTTPHeaderField: &quot;Content-Type&quot;)&lt;br&gt;request.setValue(&quot;\(httpBody.count)&quot;, forHTTPHeaderField: &quot;Content-Length&quot;)&lt;br&gt;request.httpBody = httpBody&lt;br&gt;33 行目では、文字列で URL を渡して、URL オブジェクトを生成しています。&lt;br&gt;&lt;br&gt;34 行目 ~ 38 行目で URLRequest を生成しています。&lt;br&gt;&lt;br&gt;35 行目では httpMethod に POST を設定しています。&lt;br&gt;&lt;br&gt;36 行目では setValue() でヘッダーの Content-Type に multipart/form-data; と boundary=\(boundary) を設定しています。&lt;br&gt;&lt;br&gt;37 行目では setValue() でヘッダーの Content-Length に httpBody.count (バイト数) を設定しています。&lt;br&gt;&lt;br&gt;38 行目で、URLRequest の httpBody に先ほど生成した httpBody を代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;URLSession.shared.dataTask(with: request) {(data, response, error) in&lt;br&gt;...&lt;br&gt;40 行目以降は、生成した request を URLSession.shared.dataTask(with: request) で POST し、レスポンスのデータから Success と Message のデータを取り出しているだけです。&lt;br&gt;&lt;br&gt;Swift で URLSession を使って HTTP リクエスト (POST)する方法の詳細が知りたい方は「URLSession で HTTP リクエスト (POST) する方法」をご覧ください。&lt;br&gt;&lt;br&gt;成功した場合は以下のように console に success と print されます。&lt;br&gt;&lt;br&gt;Swift - multipart/form-data で画像ファイルを POST する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で Content-Type: multipart/form-data で画像ファイルを POST する方法をご説明しました。</description><pubDate>Thu, 21 Apr 2022 02:16:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法</title><link>https://softmoco.com/devenv/how-to-install-intermediate-and-root-ca-certificates-to-iphone.php</link><description>iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;開発をしていると、自分で 公開鍵証明書認証局 (CA, Certificate Authority) を構築して、自己署名(Self-Signed)したサーバー証明書を発行して、HTTPS 通信を行なってテストしたい時があるかもしれません。&lt;br&gt;&lt;br&gt;ここでは、iPhone に自分の作った CA の、中間 CA 証明書とルート CA 証明書をインストールして、信頼する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;中間 CA 証明書とルート CA 証明書の pem ファイルが手元にある前提で説明をすすめます。&lt;br&gt;&lt;br&gt;pem ファイルをメールなどで送り、iPhone のデバイスに保存しておいてください。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;iPhone に中間 CA 証明書をインストールする&lt;br&gt;iPhone にルート CA 証明書をインストールする&lt;br&gt;iPhone でルート CA 証明書を信頼する&lt;br&gt;iPhone に中間 CA 証明書をインストールする&lt;br&gt;まずは、中間 CA 証明書を iPhone にインストールする手順をご説明します。&lt;br&gt;&lt;br&gt;iPhone に保存した 中間 CA 証明書 の pem ファイルをタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;選択できるデバイスがある場合、「デバイスを選択」画面が出てくるので [iPhone] を選択します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;「プロファイルがダウンロードされました」と表示されるので [閉じる] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;「設定」アプリを開くと「プロファイルがダウンロード済み」と表示されているので、それをタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;中間 CA 証明書のプロファイルが表示されるので [インストール] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;パスコードを入力します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;警告が表示されるので [インストール] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;[インストール] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;インストール完了画面が表示されるので、[完了] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、中間 CA 証明書がインストールできました。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iPhone にルート CA 証明書をインストールする&lt;br&gt;次に、ルート CA 証明書を iPhone にインストールする手順をご説明します。&lt;br&gt;&lt;br&gt;中間 CA 証明書のインストール方法と同じです。&lt;br&gt;&lt;br&gt;&lt;br&gt;iPhone に保存した ルート CA 証明書 の pem ファイルをタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;選択できるデバイスがある場合、「デバイスを選択」画面が出てくるので [iPhone] を選択します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;「プロファイルがダウンロードされました」と表示されるので [閉じる] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 13&lt;br&gt;&lt;br&gt;&lt;br&gt;「設定」アプリを開くと「プロファイルがダウンロード済み」と表示されているので、それをタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 14&lt;br&gt;&lt;br&gt;&lt;br&gt;ルート CA 証明書のプロファイルが表示されるので [インストール] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;パスコードを入力します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 16&lt;br&gt;&lt;br&gt;&lt;br&gt;警告が表示されるので [インストール] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 17&lt;br&gt;&lt;br&gt;&lt;br&gt;[インストール] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 18&lt;br&gt;&lt;br&gt;&lt;br&gt;インストール完了画面が表示されるので、[完了] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 19&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、ルート CA 証明書がインストールできました。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 20&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iPhone でルート CA 証明書を信頼する&lt;br&gt;インストールしたルート証明書を信頼するように設定します。&lt;br&gt;&lt;br&gt;「設定」アプリを開き、[一般] を選択します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 21&lt;br&gt;&lt;br&gt;&lt;br&gt;「一般」画面で、[情報] を選択します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 22&lt;br&gt;&lt;br&gt;&lt;br&gt;「情報」画面で、一番下までスクロールし [証明書信頼設定] を選択します。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 23&lt;br&gt;&lt;br&gt;&lt;br&gt;「証明書信頼設定」画面の「ルート証明書を全面的に信頼する」の箇所に、さきほどインストールしたルート証明書が表示されているので、オンにします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 24&lt;br&gt;&lt;br&gt;&lt;br&gt;ルート証明書の警告が表示されるので [続ける] をタップします。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 25&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、インストールしたルート証明書の信頼する設定ができました。&lt;br&gt;&lt;br&gt;iPhone に中間 CA 証明書とルート CA 証明書をインストールして信頼する方法 26&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iPhone に中間 CA 証明書とルート CA 証明書をインストールして、信頼する方法をご説明しました。</description><pubDate>Thu, 17 Mar 2022 08:12:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Swift で UIImage と Base64 文字列を変換する</title><link>https://softmoco.com/swift/swift-convert-uiimage-to-base64string.php</link><description>Swift で UIImage と Base64 文字列を変換する&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で UIImage を Base64 文字列に変換する方法と、Base64 文字列を UIImage に変換する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift で UIImage を Base64 文字列に変換する方法&lt;br&gt;Swift で Base64 文字列 を UIImage に変換する方法&lt;br&gt;Swift で UIImage を Base64 文字列に変換する方法&lt;br&gt;Swift で UIImage を Base64 文字列に変換するには、次のようにできます。&lt;br&gt;&lt;br&gt;func convertImageToBase64(_ image: UIImage) -&gt; String? {&lt;br&gt;    guard let imageData = image.jpegData(compressionQuality: 1.0) else { return nil }&lt;br&gt;    return imageData.base64EncodedString()&lt;br&gt;}&lt;br&gt;2 行目では、UIImage の jpegData() メソッドで jpeg の Data オブジェクトを生成して、失敗した時は nil を return しています。&lt;br&gt;&lt;br&gt;compressionQuality は 0.0 から 1.0 で指定でき、0.0 が圧縮率が一番高く低画質、 1.0 が圧縮率が一番低く高画質になります。&lt;br&gt;&lt;br&gt;UIImage の pngData() メソッドで png の Data を生成する方法もありますが、orientation を調整が必要になる可能性があります。&lt;br&gt;&lt;br&gt;3 行目で、Data の base64EncodedString() メソッドを使って、Base64 の文字列を取得して return しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で Base64 文字列 を UIImage に変換する方法&lt;br&gt;Swift で Base64 文字列 を UIImage に変換するには、次のようにできます。&lt;br&gt;&lt;br&gt;func convertBase64ToImage(_ base64String: String) -&gt; UIImage? {&lt;br&gt;    guard let imageData = Data(base64Encoded: base64String) else { return nil }&lt;br&gt;    return UIImage(data: imageData)&lt;br&gt;}&lt;br&gt;2 行目では、Data の init(base64Encoded:options:) イニシャライザーを使って、Base64 文字列から Data オブジェクトを生成して、失敗した時は nil を return しています。&lt;br&gt;&lt;br&gt;3 行目で、UIImage の init(data:) イニシャライザーを使って、Data オブジェクトから UIImage オブジェクトを生成して return しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で UIImage を Base64 文字列に変換する方法と、Base64 文字列を UIImage に変換する方法をご説明しました。</description><pubDate>Sun, 27 Feb 2022 09:28:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>Swift - 画像ファイルを Photo Library に保存・取得する方法</title><link>https://softmoco.com/basics/swift-how-to-save-image-file-to-photo-library.php</link><description>Swift - 画像ファイルを Photo Library に保存・取得する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で画像ファイルを写真ライブラリ (Photo Library) に保存・取得する方法をご説明します。&lt;br&gt;&lt;br&gt;前回 「カメラで写真を撮る方法」で、Take Photo というボタンをタップした時に、カメラが起動して写真を撮り、元の画面に撮った写真が表示されるアプリを作りました。&lt;br&gt;&lt;br&gt;今回はそのアプリに Save to Photo Library、Clear Photo、Select from Photo Library の三つのボタンを追加して、画像ファイルを Photo Library に保存・取得する機能を追加します。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;写真を撮る iOS アプリにボタンとアクションを追加する&lt;br&gt;Swift で画像ファイルを Photo Library に保存する方法&lt;br&gt;Swift で画像を Photo Library から選択して表示する方法&lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;写真を撮る iOS アプリにボタンとアクションを追加する&lt;br&gt;まずは、カメラで写真を撮る iOS アプリに、今回テストに使う三つのボタンを追加して、アクションを作っておきます。&lt;br&gt;&lt;br&gt;カメラで写真を撮る iOS アプリをまだ作っていない方は「カメラで写真を撮る方法」を参考に作っておいてください。&lt;br&gt;&lt;br&gt;プロジェクトを開き、Main ストーリーボードの View Controller の Take Photo ボタンの下に、Save to Photo Library、Clear Photo、Select from Photo Library の三つのボタンを追加します。&lt;br&gt;&lt;br&gt;ここでは Stack View に入れていますが、配置や色など、適当で大丈夫です。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Save to Photo Library、Clear Photo、Select from Photo Library ボタンから、それぞれ、saveToPhotoLibraryTapped、clearPhotoTapped、selectFromPhotoLibraryTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 2&lt;br&gt;&lt;br&gt;@IBAction func saveToPhotoLibraryTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;@IBAction func clearPhotoTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;@IBAction func selectFromPhotoLibraryTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;Clear Photo ボタンをタップした時には、UIImageView の画像を削除したいので、次の一行のコードを追加しておきます。&lt;br&gt;&lt;br&gt;imageView は UIImageView のアウトレットです。&lt;br&gt;&lt;br&gt;@IBAction func clearPhotoTapped(_ sender: Any) {&lt;br&gt;    imageView.image = nil&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift で画像ファイルを Photo Library に保存する方法&lt;br&gt;Swift で Photo Library に UIImageView に表示されている写真を保存します。&lt;br&gt;&lt;br&gt;まず、iOS アプリ内で Photo Library に画像を保存・取得するのに、info.plist に Privacy - Photo Library Usage Description (NSPhotoLibraryUsageDescription) と Privacy - Photo Library Additions Usage Description (NSPhotoLibraryAddUsageDescription) を追加しておきます。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 3&lt;br&gt;&lt;br&gt;Privacy - Photo Library Usage Description (NSPhotoLibraryUsageDescription) だけでも、Photo Library に写真を保存できることはできるのですが、エラーが出ることがあるので、Photo Library への書き込み専用の Privacy - Photo Library Additions Usage Description (NSPhotoLibraryAddUsageDescription) も追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;続いて、Save to Photo Library ボタンをタップした時に、UIImageView の image を Photo Library に保存するコードを書きます。&lt;br&gt;&lt;br&gt;ViewController.swift に先ほど作った saveToPhotoLibraryTapped() を以下のように変更し、image() も追加します。&lt;br&gt;&lt;br&gt;@IBAction func saveToPhotoLibraryTapped(_ sender: Any) {&lt;br&gt;    guard let image = imageView.image else { return }&lt;br&gt;    UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)&lt;br&gt;}&lt;br&gt;&lt;br&gt;@objc func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {&lt;br&gt;    if let error = error {&lt;br&gt;        print(&quot;Failed to save photo: \(error)&quot;)&lt;br&gt;    } else {&lt;br&gt;        print(&quot;Photo saved successfully.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;2 行目では、guard let で imageView（UIImageView のアウトレット）から image データを取得し、もし取得できなかったら return しています。&lt;br&gt;&lt;br&gt;3 行目で UIImageWriteToSavedPhotosAlbum() メソッドを使って、画像データを Photo Library のカメラロールのアルバムに保存しています。&lt;br&gt;&lt;br&gt;UIImageWriteToSavedPhotosAlbum の構文は以下の通りで、第二引数と第三引数で、保存処理後にこの View Controller の image() が呼ばれるように指定しています。&lt;br&gt;&lt;br&gt;@func UIImageWriteToSavedPhotosAlbum(_ image: UIImage, &lt;br&gt;                                     _ completionTarget: Any?, &lt;br&gt;                                     _ completionSelector: Selector?, &lt;br&gt;                                     _ contextInfo: UnsafeMutableRawPointer?)}&lt;br&gt;6 行目から 11 行目の image() 内では、error が入っている時は、エラーメッセージを、成功した時は &quot;Photo saved successfully.&quot; をプリントするようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;画像ファイルを Photo Library に保存するコードは以上です。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift で画像を Photo Library から選択して表示する方法&lt;br&gt;次は、Swift で写真ライブラリ (Photo Library) に保存されている画像を取得します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Select from Photo Library ボタンをタップした時に、Photo Library から写真を選択する Image Picker 画面をたちあげ、選択された 画像を UIImageView に表示するコードを書きます。&lt;br&gt;&lt;br&gt;UIImagePickerController はカメラで写真を撮る時にも使いましたが、それとほぼ同じ方法で sourceType を .camera から .photoLibrary に変更するだけで、Photo Library から写真を選択することができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;カメラとフォトライブラリで同じ UIImagePickerController を使うようにコードを変更します。&lt;br&gt;&lt;br&gt;こちらが変更後の ViewController.swift で、ハイライトされている箇所が変更した箇所です。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var imageView: UIImageView!&lt;br&gt;    var imagePicker: UIImagePickerController!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        imagePicker = UIImagePickerController()&lt;br&gt;        imagePicker.delegate = self&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func takePhotoTapped(_ sender: Any) {&lt;br&gt;        if UIImagePickerController.isSourceTypeAvailable(.camera) {&lt;br&gt;            imagePicker.sourceType = .camera&lt;br&gt;            self.present(imagePicker, animated: true, completion: nil)&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Camera not available.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {&lt;br&gt;        picker.dismiss(animated: true)&lt;br&gt;&lt;br&gt;        guard let image = info[.originalImage] as? UIImage else {&lt;br&gt;            print(&quot;Image not found.&quot;)&lt;br&gt;            return&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        imageView.image = image&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func saveToPhotoLibraryTapped(_ sender: Any) {&lt;br&gt;        guard let image = imageView.image else { return }&lt;br&gt;        UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    @objc func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {&lt;br&gt;        if let error = error {&lt;br&gt;            print(&quot;Failed to save photo: \(error)&quot;)&lt;br&gt;        } else {&lt;br&gt;            print(&quot;Photo saved successfully.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func clearPhotoTapped(_ sender: Any) {&lt;br&gt;        imageView.image = nil&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func selectFromPhotoLibraryTapped(_ sender: Any) {&lt;br&gt;        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {&lt;br&gt;            imagePicker.sourceType = .photoLibrary&lt;br&gt;            self.present(imagePicker, animated: true, completion: nil)&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Photo Library not available.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;54 ~ 60 行目が、Select from Photo Library ボタンがタップされた時に実行されるコードです。&lt;br&gt;&lt;br&gt;54 行目で Photo Library が利用可能かチェックしています。&lt;br&gt;&lt;br&gt;55 行目で UIImagePickerController の sourceType を .photoLibrary に設定しています。&lt;br&gt;&lt;br&gt;56 行目の self.present() メソッドで、UIImagePickerController を表示し、Photo Library から写真を選択する画面を起動します。&lt;br&gt;&lt;br&gt;ユーザーがフォトライブラリの写真をタップした時に、25 ~ 34 行目の imagePickerController(_:didFinishPickingMediaWithInfo:) メソッドが実行され、その中で選択された写真を Image Viwer に表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、Swift で画像を Photo Library から選択して表示するコードが書けました。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;写真を撮る箇所がシミュレーターでできないので、iPhone にインストールしてテストします。&lt;br&gt;&lt;br&gt;作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;iPhone を指定してこのアプリを実行すると、以下のような画面が表示されるので、Take Photo ボタンをタップします。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;カメラの利用許可を求めるダイアログが表示されるので、OK をタップします。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;カメラが起動するので、写真を撮ります。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;この写真でよければ、Use Photo をタップします。撮り直したい時は Retake をタップして撮り直してください。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;Use Photo をタップすると、カメラが閉じ、元の画面に戻って、撮った写真が画面に表示されるので、Save to Photo Library をタップして写真を保存します。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;アプリをインストールしてはじめて、Photo Library にアクセスしようとした時に、利用許可を求めるダイアログが表示されるので、OK をタップします。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode の output window に Photo saved successfully. と表示され、写真アプリを開くとこの画像が入っています。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;Clear Photo ボタンをタップして、Image View の画像を一旦削除します。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;Select from Photo Library ボタンをタップすると、Photo Library の写真が表示されます。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;Photo Library の写真をタップすると、画面が閉じ、元の画面の UIImageView に選択した画像が表示されます。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 13&lt;br&gt;&lt;br&gt;Swift - 画像ファイルを写真ライブラリに保存・取得する方法 14&lt;br&gt;&lt;br&gt;&lt;br&gt;ちなみに、何度も Save to Photo Library ボタンをタップすると、その数だけ画像が Photo Library に保存されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で画像ファイルを写真ライブラリ (Photo Library) に保存・取得する方法をご説明しました。</description><pubDate>Wed, 16 Feb 2022 06:51:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法</title><link>https://softmoco.com/basics/swift-how-to-save-image-file-to-document-directory.php</link><description>Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で画像ファイルをデバイスの Document Directory に保存・取得する方法をご説明します。&lt;br&gt;&lt;br&gt;前回 「カメラで写真を撮る方法」で、Take Photo というボタンをタップした時に、カメラが起動して写真を撮り、元の画面に撮った写真が表示されるアプリを作りました。&lt;br&gt;&lt;br&gt;今回はそのアプリに Save Photo、Clear Photo、Load Photo の三つのボタンを追加して、画像ファイルをデバイスの Document Directory に保存・取得する機能を追加します。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;写真を撮る iOS アプリにボタンとアクションを追加する&lt;br&gt;Swift で画像ファイルを Document Directory に保存する方法&lt;br&gt;Swift で画像ファイルを Document Directory から取得する方法&lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;写真を撮る iOS アプリにボタンとアクションを追加する&lt;br&gt;まずは、カメラで写真を撮る iOS アプリに、今回テストに使う三つのボタンを追加して、アクションを作っておきます。&lt;br&gt;&lt;br&gt;カメラで写真を撮る iOS アプリをまだ作っていない方は「カメラで写真を撮る方法」を参考に作っておいてください。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;プロジェクトを開き、Main ストーリーボードの View Controller の Take Photo ボタンの下に、Save Photo、Clear Photo、Load Photo の三つのボタンを追加します。&lt;br&gt;&lt;br&gt;ここでは Stack View に入れていますが、配置や色など、適当で大丈夫です。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Save Photo、Clear Photo、Load Photo ボタンから、それぞれ、savePhotoTapped、clearPhotoTapped、loadPhotoTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 2&lt;br&gt;&lt;br&gt;@IBAction func savePhotoTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;@IBAction func clearPhotoTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;@IBAction func loadPhotoTapped(_ sender: Any) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;Clear Photo ボタンをタップした時には、UIImageView の画像を削除したいので、次の一行のコードを追加しておきます。&lt;br&gt;&lt;br&gt;imageView は UIImageView のアウトレットです。&lt;br&gt;&lt;br&gt;@IBAction func clearPhotoTapped(_ sender: Any) {&lt;br&gt;    imageView.image = nil&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift で画像ファイルを Document Directory に保存する方法&lt;br&gt;Swift でデバイスのユーザーの Document Directory に UIImageView に表示されている写真を保存します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Save Photo ボタンをタップした時に、UIImageView の image を保存するコードを書きます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;ViewController.swift に getFileURL() を追加し、先ほど作った savePhotoTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;func getFileURL(fileName: String) -&gt; URL {&lt;br&gt;    let docDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!&lt;br&gt;    return docDir.appendingPathComponent(fileName)&lt;br&gt;}&lt;br&gt;&lt;br&gt;@IBAction func savePhotoTapped(_ sender: Any) {&lt;br&gt;    guard let imageData = imageView.image?.jpegData(compressionQuality: 1.0) else {&lt;br&gt;        return&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    do {&lt;br&gt;        try imageData.write(to: getFileURL(fileName: &quot;IMG12345.jpg&quot;))&lt;br&gt;        print(&quot;Image saved.&quot;)&lt;br&gt;    } catch {&lt;br&gt;        print(&quot;Failed to save the image:&quot;, error)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;getFileURL() は fileName を受け取って、documentDirectory の、そのファイルの URL を返す関数です。&lt;br&gt;&lt;br&gt;2 行目の FileManager.default.urls() で、指定したドメインの共通ディレクトリの URL を取得します。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;今回は、for: .documentDirectory, in: .userDomainMask と引数を指定することで、ユーザーのドキュメントディレクトリの URL 取得しています。&lt;br&gt;&lt;br&gt;userDomainMask は、ユーザーのホームディレクトリで、ユーザーのファイルなどを保存できる領域です。&lt;br&gt;&lt;br&gt;そして、urls() メソッドは URL の配列を返すので、ひとつめの URL を取得しています。&lt;br&gt;&lt;br&gt;3 行目 で、appendingPathComponent() を使って、パスにファイル名を追加して、その URL を返してします。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、savePhotoTapped() 内のコードを説明します。&lt;br&gt;&lt;br&gt;7 行目では、guard let で imageView（UIImageView のアウトレット）から jpegData 取得し、もし取得できなかったら return しています。&lt;br&gt;&lt;br&gt;compressionQuality は 0.0 ~ 1.0 で指定でき、0.0 が一番圧縮される＆低クオリティ、1.0 が一番圧縮されない＆高クオリティになります。&lt;br&gt;&lt;br&gt;12 行目で Data の write() メソッドを使って、画像データをユーザーのドキュメントディレクトリに保存しています。&lt;br&gt;&lt;br&gt;今回はファイル名は固定で IMG12345.jpg にしています。&lt;br&gt;&lt;br&gt;画像ファイルをユーザーの Document Directory に保存するコードは以上です。&lt;br&gt;&lt;br&gt;Swift で画像ファイルを Document Directory から取得する方法&lt;br&gt;次は、Swift でデバイスのユーザーの Document Directory に保存されている画像ファイルから画像データを取得します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Load Photo ボタンをタップした時に、ユーザーの Document Directory 保存した画像ファイルを読み込み、UIImageView に表示するコードを書きます。&lt;br&gt;&lt;br&gt;ViewController.swift の loadPhotoTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func loadPhotoTapped(_ sender: Any) {&lt;br&gt;    let path = getFileURL(fileName: &quot;IMG12345.jpg&quot;).path&lt;br&gt;&lt;br&gt;    if FileManager.default.fileExists(atPath: path) {&lt;br&gt;        if let imageData = UIImage(contentsOfFile: path) {&lt;br&gt;            imageView.image = imageData&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Failed to load the image.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    else {&lt;br&gt;        print(&quot;Image file not found.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;2 行目では、先ほど保存した画像ファイル IMG12345.jp の URL の path を取得しています。&lt;br&gt;&lt;br&gt;4 行目の FileManager.default.fileExists() で path のファイルが存在するか確認し、存在していれば、UIImage(contentsOfFile: path) で画像ファイルから UIImage オブジェクトを生成して imageData に代入しています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;6 行目で、imageData が nil でなければ、imageView.image に imageData を代入して、UIImageView に読み込んだ画像を表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、Swift で画像データをユーザーの Document Directory の保存し、その画像ファイルを読み込んで UIImageView に表示するコードが書けました。&lt;br&gt;&lt;br&gt;できあがった ViewController.swift を載せておきます。今回追加したのは 34 ~ 70 行目です。&lt;br&gt;&lt;br&gt;info.plist の設定など詳しくは「カメラで写真を撮る方法」をご覧ください。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var imageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func takePhotoTapped(_ sender: Any) {&lt;br&gt;        if UIImagePickerController.isSourceTypeAvailable(.camera) {&lt;br&gt;            let imagePicker = UIImagePickerController()&lt;br&gt;            imagePicker.sourceType = .camera&lt;br&gt;            imagePicker.delegate = self&lt;br&gt;            self.present(imagePicker, animated: true, completion: nil)&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Camera not available.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {&lt;br&gt;        picker.dismiss(animated: true)&lt;br&gt;&lt;br&gt;        guard let image = info[.originalImage] as? UIImage else {&lt;br&gt;            print(&quot;Image not found.&quot;)&lt;br&gt;            return&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        imageView.image = image&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func getFileURL(fileName: String) -&gt; URL {&lt;br&gt;        let docDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!&lt;br&gt;        return docDir.appendingPathComponent(fileName)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func savePhotoTapped(_ sender: Any) {&lt;br&gt;        guard let imageData = imageView.image?.jpegData(compressionQuality: 1.0) else {&lt;br&gt;            return&lt;br&gt;        }&lt;br&gt;    &lt;br&gt;        do {&lt;br&gt;            try imageData.write(to: getFileURL(fileName: &quot;IMG12345.jpg&quot;))&lt;br&gt;            print(&quot;Image saved.&quot;)&lt;br&gt;        } catch {&lt;br&gt;            print(&quot;Failed to save the image:&quot;, error)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func clearPhotoTapped(_ sender: Any) {&lt;br&gt;        imageView.image = nil&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func loadPhotoTapped(_ sender: Any) {&lt;br&gt;        let path = getFileURL(fileName: &quot;IMG12345.jpg&quot;).path&lt;br&gt;&lt;br&gt;        if FileManager.default.fileExists(atPath: path) {&lt;br&gt;            if let imageData = UIImage(contentsOfFile: path) {&lt;br&gt;                imageView.image = imageData&lt;br&gt;            }&lt;br&gt;            else {&lt;br&gt;                print(&quot;Failed to load the image.&quot;)&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Image file not found.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;写真を撮る箇所がシミュレーターでできないので、iPhone にインストールしてテストします。&lt;br&gt;&lt;br&gt;作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;iPhone を指定してこのアプリを実行すると、以下のような画面が表示されるので、Take Photo ボタンをタップします。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;インストールして初回の起動時はカメラの利用許可を求めるダイアログが表示されるので、OK をタップします。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;カメラが起動するので、写真を撮ります。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;この写真でよければ、Use Photo をタップします。撮り直したい時は Retake をタップして撮り直してください。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Use Photo をタップすると、カメラが閉じ、元の画面に戻って、撮った写真が画面に表示されるので、Save Photo をタップして写真を保存します。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 6&lt;br&gt;&lt;br&gt;Xcode の output window に Image saved. と表示されるはずです。&lt;br&gt;&lt;br&gt;&lt;br&gt;Clear Photo ボタンをタップして、Image View の画像を一旦削除します。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;Load Photo ボタンをタップして、ユーザーの Document Directory に保存した画像をロードして表示します。&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 7&lt;br&gt;&lt;br&gt;Swift - 画像ファイルをデバイスの Document Directory に保存・取得する方法 8&lt;br&gt;&lt;br&gt;画像はデバイスに保存されているので、一旦アプリを落として再起動し、いきなり Load Photo をタップしても写真が表示されるはずです。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で画像ファイルをデバイスの Document Directory に保存・取得する方法をご説明しました。</description><pubDate>Thu, 10 Feb 2022 22:54:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - UserDefaults にデータを保存・取得する方法</title><link>https://softmoco.com/basics/swift-how-to-use-userdefaults.php</link><description>Swift - UserDefaults にデータを保存・取得する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で UserDefaults にデータを保存・取得する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;UserDefaults とは？&lt;br&gt;UserDefaults にデータを保存・取得する方法&lt;br&gt;UserDefaults からデータを削除する方法&lt;br&gt;UserDefaults とは？&lt;br&gt;iOS アプリ内で、データをデバイスに保存しておくには何通りか方法があります。&lt;br&gt;&lt;br&gt;UserDefaults はその選択肢のひとつで、キー・バリューペアとしてデータを簡単にデバイスに保存・取得することができます。&lt;br&gt;&lt;br&gt;アプリの設定データなど、小さめのデータを保存するのに適していて、アプリ内のどこからでも保存・取得できます。&lt;br&gt;&lt;br&gt;大きいデータをデバイスに保存したい時は、Core Data や SQLite などを検討したほうが良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;UserDefaults にデータを保存・取得する方法&lt;br&gt;Swift で UserDefaults にデータを保存するには、set() メソッドを使います。&lt;br&gt;&lt;br&gt;func set(Any?, forKey: String)&lt;br&gt;func set(Float, forKey: String)&lt;br&gt;func set(Double, forKey: String)&lt;br&gt;func set(Int, forKey: String)&lt;br&gt;func set(Bool, forKey: String)&lt;br&gt;func set(URL?, forKey: String)&lt;br&gt;&lt;br&gt;Swift で UserDefaults からデータを保存するには、保存した値のデータ型に応じて以下のメソッドを使います。&lt;br&gt;&lt;br&gt;func object(forKey: String) -&gt; Any?&lt;br&gt;func url(forKey: String) -&gt; URL?&lt;br&gt;func array(forKey: String) -&gt; [Any]?&lt;br&gt;func dictionary(forKey: String) -&gt; [String : Any]?&lt;br&gt;func string(forKey: String) -&gt; String?&lt;br&gt;func stringArray(forKey: String) -&gt; [String]?&lt;br&gt;func data(forKey: String) -&gt; Data?&lt;br&gt;func bool(forKey: String) -&gt; Bool&lt;br&gt;func integer(forKey: String) -&gt; Int&lt;br&gt;func float(forKey: String) -&gt; Float&lt;br&gt;func double(forKey: String) -&gt; Double&lt;br&gt;func dictionaryRepresentation() -&gt; [String : Any]&lt;br&gt;&lt;br&gt;例えば、&quot;UseLocation&quot; というキーで、Bool の値を保存・取得したい時は次のようにできます。&lt;br&gt;&lt;br&gt;// Save&lt;br&gt;UserDefaults.standard.set(true, forKey: &quot;UseLocation&quot;)&lt;br&gt;&lt;br&gt;// Retrieve&lt;br&gt;let useLocation = UserDefaults.standard.bool(forKey: &quot;UseLocation&quot;)&lt;br&gt;print(useLocation) // true&lt;br&gt;&lt;br&gt;&quot;UserInfo&quot; というキーで、Dictionary を保存したい時は次のようにできます。&lt;br&gt;&lt;br&gt;// Save&lt;br&gt;let dict:[String : Any] = [&quot;Name&quot;: &quot;Suzuki&quot;, &quot;Age&quot;: 15, &quot;Gender&quot;: &quot;M&quot;]&lt;br&gt;UserDefaults.standard.set(dict, forKey: &quot;UserInfo&quot;)&lt;br&gt;&lt;br&gt;// Retrieve&lt;br&gt;if let userInfo = UserDefaults.standard.dictionary(forKey: &quot;UserInfo&quot;) {&lt;br&gt;    print(userInfo) // [&quot;Gender&quot;: M, &quot;Age&quot;: 15, &quot;Name&quot;: Suzuki]&lt;br&gt;}&lt;br&gt;&lt;br&gt;自分で作った struct や class のインスタンスを値として保存したい時は、struct や class を定義するときに Codable をコンフォームしておいて、JSON データにエンコード・デコードして保存・取得できます。&lt;br&gt;&lt;br&gt;次のような User struct のインスタンスを &quot;UserData&quot; というキーで保存・取得するには次のようにできます。&lt;br&gt;&lt;br&gt;struct User: Codable {&lt;br&gt;    var UserID: Int&lt;br&gt;    var UserName: String&lt;br&gt;    var Age: Int&lt;br&gt;}&lt;br&gt;// Save&lt;br&gt;let user = User(UserID: 1, UserName: &quot;Suzuki&quot;, Age: 15)&lt;br&gt;if let jsonData = try? JSONEncoder().encode(user) {&lt;br&gt;    UserDefaults.standard.set(jsonData, forKey: &quot;UserData&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;// Retrieve&lt;br&gt;if let data = UserDefaults.standard.data(forKey: &quot;UserData&quot;) {&lt;br&gt;    if let userData = try? JSONDecoder().decode(User.self, from: data) {&lt;br&gt;        print(userData) // User(UserID: 1, UserName: &quot;Suzuki&quot;, Age: 15)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;UserDefaults からデータを削除する方法&lt;br&gt;Swift で UserDefaults からデータを削除するには、removeObject() メソッドを使います。&lt;br&gt;&lt;br&gt;func removeObject(forKey: String)&lt;br&gt;&lt;br&gt;例えば、先ほど UserDefaults に作成した &quot;UseLocation&quot; のキーバリューペアを削除したい時は次のようにします。&lt;br&gt;&lt;br&gt;UserDefaults.standard.removeObject(forKey: &quot;UseLocation&quot;)&lt;br&gt;&lt;br&gt;以上、Swift で UserDefaults にデータを保存・取得する方法をご説明しました。</description><pubDate>Thu, 03 Feb 2022 01:03:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift - カメラで写真を撮る方法</title><link>https://softmoco.com/basics/swift-how-to-take-photo.php</link><description>Swift - カメラで写真を撮る方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift でカメラで写真を撮る方法をご説明します。&lt;br&gt;&lt;br&gt;今回は、次のように Take Photo というボタンをタップした時に、カメラが起動して写真を撮り、元の画面に撮った写真が表示されるアプリを作ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;カメラで写真を撮る iOS アプリの準備をする&lt;br&gt;Swift でカメラで写真を撮る方法&lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;カメラで写真を撮る iOS アプリの準備をす&lt;br&gt;まずはテスト用にボタンをタップして、カメラを起動し、写真を撮るための iOS アプリを作ります。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に撮った写真を表示するための Image View と、カメラを起動するための Button をひとつ追加します。&lt;br&gt;&lt;br&gt;ボタンの Title を Take Photo にしておきます。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;UIImageView から、imageView という名前でアウトレットを作っておきます。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 2&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var imageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Take Photo ボタンから、takePhotoTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var imageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func takePhotoTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift でカメラで写真を撮る方法&lt;br&gt;それでは、Swift で iOS アプリからカメラを起動し、写真を撮るコードを書いていきましょう。&lt;br&gt;&lt;br&gt;まず、iOS アプリ内でカメラを使うので、info.plist に Privacy - Camera Usage Description (NSCameraUsageDescription) を追加しておきます。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 4&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;次に ViewController で UIImagePickerController からのイベント受け取るために、UIImagePickerControllerDelegate と UINavigationControllerDelegate をコンフォームしておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var imageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func takePhotoTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;続いて、Take Photo ボタンをタップした時に UIImagePickerController を生成して表示するコードを書きます。&lt;br&gt;&lt;br&gt;先ほど、作った ViewController.swift の takePhotoTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func takePhotoTapped(_ sender: Any) {&lt;br&gt;    if UIImagePickerController.isSourceTypeAvailable(.camera) {&lt;br&gt;        let imagePicker = UIImagePickerController()&lt;br&gt;        imagePicker.sourceType = .camera&lt;br&gt;        imagePicker.delegate = self&lt;br&gt;        self.present(imagePicker, animated: true, completion: nil)&lt;br&gt;    }&lt;br&gt;    else {&lt;br&gt;        print(&quot;Camera not available.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;2 行目でカメラが利用可能かチェックしています。&lt;br&gt;&lt;br&gt;3 行目で UIImagePickerController を生成し、4 行目で sourceType を camera に設定しています。&lt;br&gt;&lt;br&gt;5 行目の imagePicker.delegate = self で ImagePickerController が送ってくるイベントをこの View Controller が受けとるようにしています。&lt;br&gt;&lt;br&gt;6 行目の self.present() メソッドで、生成した UIImagePickerController を表示し、カメラを起動します。&lt;br&gt;&lt;br&gt;&lt;br&gt;ユーザーが写真を撮って Use Photo をタップした時に、imagePickerController(_:didFinishPickingMediaWithInfo:) メソッドが実行されるので、その中で撮った写真を Image Viwer に表示します。&lt;br&gt;&lt;br&gt;カメラの下の Retake、Use Photo のボタンを「再撮影」「写真を使用」のように日本語にしたい時は info.plist に Localization native development region (CFBundleDevelopmentRegion) を追加して Japan (ja_JP) を指定することで変更できます。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 6&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController クラスに以下の imagePickerController(_:didFinishPickingMediaWithInfo:) メソッドを追加します。&lt;br&gt;&lt;br&gt;func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {&lt;br&gt;    picker.dismiss(animated: true)&lt;br&gt;&lt;br&gt;    guard let image = info[.originalImage] as? UIImage else {&lt;br&gt;        print(&quot;Image not found.&quot;)&lt;br&gt;        return&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    imageView.image = image&lt;br&gt;}&lt;br&gt;2 行目では表示していた UIImagePickerController を閉じています。&lt;br&gt;&lt;br&gt;引数の info という dictionary にカメラで撮った画像が入っています。 4 ~ 7 行目では、そこから guard let で originalImage を取得して、取得できなかったら時はエラーメッセージをプリントして return しています。&lt;br&gt;&lt;br&gt;9 行目で、取得した画像を imageView.image に入れて、画面に表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、Swift で iOS アプリからカメラを起動し、写真を撮るコードが書けました。&lt;br&gt;&lt;br&gt;できあがった ViewController.swift を載せておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {&lt;br&gt;&lt;br&gt;    @IBOutlet weak var imageView: UIImageView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func takePhotoTapped(_ sender: Any) {&lt;br&gt;        if UIImagePickerController.isSourceTypeAvailable(.camera) {&lt;br&gt;            let imagePicker = UIImagePickerController()&lt;br&gt;            imagePicker.sourceType = .camera&lt;br&gt;            imagePicker.delegate = self&lt;br&gt;            self.present(imagePicker, animated: true, completion: nil)&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;            print(&quot;Camera not available.&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {&lt;br&gt;        picker.dismiss(animated: true)&lt;br&gt;&lt;br&gt;        guard let image = info[.originalImage] as? UIImage else {&lt;br&gt;            print(&quot;Image not found.&quot;)&lt;br&gt;            return&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        imageView.image = image&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;写真を撮るテストはシミュレーターでできないので、iPhone にインストールしてテストします。&lt;br&gt;&lt;br&gt;作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;iPhone を指定してこのアプリを実行すると、以下のような画面が表示されるので、Take Photo ボタンをタップします。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;カメラの利用許可を求めるダイアログが表示されるので、OK をタップします。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;カメラが起動するので、写真を撮ります。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;この写真でよければ、Use Photo をタップします。撮り直したい時は Retake をタップして撮り直してください。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;Use Photo をタップすると、カメラが閉じ、元の画面に戻って、撮った写真が画面に表示されます。&lt;br&gt;&lt;br&gt;Swift - カメラで写真を撮る方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift でカメラで写真を撮る方法をご説明しました。</description><pubDate>Wed, 02 Feb 2022 09:46:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift で URL を既定のブラウザで開く方法</title><link>https://softmoco.com/basics/swift-how-to-open-url.php</link><description>Swift で URL を既定のブラウザで開く方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で URL を既定のブラウザで開く方法をご説明します。&lt;br&gt;&lt;br&gt;今回は、OPEN URL というボタンをタップした時に、以下のように指定した URL (https://www.swift.org/) を既定のブラウザで開くアプリを作ります。&lt;br&gt;&lt;br&gt;Swift で URL を既定のブラウザで開く方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;URL を開くiOS アプリの準備をする&lt;br&gt;Swift で iOS アプリから URL を指定してブラウザを開く方法&lt;br&gt;iOS アプリをシミュレータにインストールしてテストする&lt;br&gt;URL を開くiOS アプリの準備をする&lt;br&gt;まずはテスト用にボタンをタップして、URL を既定のブラウザで開くための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Button をひとつ追加します。&lt;br&gt;&lt;br&gt;Swift で URL を既定のブラウザで開く方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;そのボタンから、openURLTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;Swift で URL を既定のブラウザで開く方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func openURLTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift で iOS アプリから URL を指定してブラウザを開く方法&lt;br&gt;それでは、Swift で iOS アプリから URL を既定のブラウザで開くコードを書いていきましょう。&lt;br&gt;&lt;br&gt;iOS アプリから URL を開くには、次のような UIApplication の open() メソッドを使います。&lt;br&gt;&lt;br&gt;func open(_ url: URL, &lt;br&gt;   options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:], &lt;br&gt;   completionHandler completion: ((Bool) -&gt; Void)? = nil)&lt;br&gt;一つ目の引数の url は必須で、options と completionHandler はオプショナルです。&lt;br&gt;&lt;br&gt;ただ、url をブラウザで開くだけであれば、url だけ指定すれば大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほど、作った ViewController.swift の openURLTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func openURLTapped(_ sender: Any) {&lt;br&gt;    guard let url = URL(string: &quot;https://www.swift.org&quot;) else { return }&lt;br&gt;    UIApplication.shared.open(url)&lt;br&gt;}&lt;br&gt;2 行目で URL の文字列から、URLオブジェクトを生成しています。guard let で生成に失敗したら return するようにしています。&lt;br&gt;&lt;br&gt;3 行目で UIApplication.shared.open() メソッドに、生成した url を渡して、既定のブラウザを起動して、URL で指定したウエブページを開いています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で iOS アプリから URL を既定のブラウザで開くコードはこれだけです。&lt;br&gt;&lt;br&gt;info.plist に、アクセス許可などを追加する必要はありません。&lt;br&gt;&lt;br&gt;&lt;br&gt;デバイスにブラウザのアプリがインストールされていないことはあまりないと思います。&lt;br&gt;&lt;br&gt;ですが、念の為、URL をハンドルできるアプリがインストールされているか確認したい時は、UIApplication.shared.canOpenURL(url) メソッドで確認することができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリをシミュレータにインストールしてテストする&lt;br&gt;作った iOS アプリをシミュレータにインストールしてテストします。&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレータを指定してこのアプリを実行します。&lt;br&gt;&lt;br&gt;Swift で URL を既定のブラウザで開く方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;アプリが起動すると、以下のような画面が表示されます&lt;br&gt;&lt;br&gt;Swift で URL を既定のブラウザで開く方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;OPEN URL ボタンをクリックすると、デフォルトのブラウザのサファリが起動し、https://www.swift.org のページが表示されます。&lt;br&gt;&lt;br&gt;Swift で URL を既定のブラウザで開く方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;Google Chrome をデフォルトのブラウザに設定している場合は、Chrome が起動して、https://www.swift.org のページが表示されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で URL を既定のブラウザで開く方法をご説明しました。&lt;br&gt;</description><pubDate>Thu, 20 Jan 2022 09:30:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift でナビゲーションコントローラーを使った画面遷移で前の画面に戻る方法</title><link>https://softmoco.com/basics/swift-how-to-pop-view-controllers.php</link><description>Swift でナビゲーションコントローラーを使った画面遷移で前の画面に戻る方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift で、ナビゲーションコントローラーを使った画面遷移で前の画面に戻る方法をご説明します。&lt;br&gt;&lt;br&gt;ナビゲーションコントローラーを使って、NEXT ボタンをタップした時に以下のような画面遷移をするとします。&lt;br&gt;&lt;br&gt;ここで、DONE ボタンをタップした時に No. 2 の画面から No. 1 の画面に戻ったり、No. 3 の画面から No. 1 の画面に戻る方法をご紹介します。&lt;br&gt;&lt;br&gt;アプリは Navigation Controller を使っていて、ボタンからの Show segue でつないでいるだけです。&lt;br&gt;&lt;br&gt;Swift ナビゲーションコントローラーを使った画面遷移で前の画面に戻る方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift でひとつ前の画面に戻る方法&lt;br&gt;Swift で複数前の画面に戻る方法&lt;br&gt;Swift でルート View Controller に戻る方法&lt;br&gt;Swift でひとつ前の画面に戻る方法&lt;br&gt;Swift で、ナビゲーションコントローラーを使った画面遷移でひとつ前の画面に戻るには、ナビゲーションコントローラの popViewControllerメソッドが使えます。&lt;br&gt;&lt;br&gt;例えば、二つ目の画面の DONE ボタンをタップした時にひとつ前の画面に戻りたい時には次のようにできます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController2: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func doneButtonTapped(_ sender: Any) {&lt;br&gt;        self.navigationController?.popViewController(animated: true)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;self.navigationController?.popViewController(animated: true) で一番上に表示されている現在の View Controller がナビゲーションスタックからポップされて、ひとつ前の画面に戻ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で複数前の画面に戻る方法&lt;br&gt;Swift で、ナビゲーションコントローラーを使った画面遷移で複数前の画面に戻るには、ナビゲーションコントローラの popToViewControllerメソッドが使えます。&lt;br&gt;&lt;br&gt;popToViewController メソッドの第一引数にはポップした後に表示させたい viewController を指定します。&lt;br&gt;&lt;br&gt;例えば、三つ目の画面の DONE ボタンをタップした時に、二つ前の画面に戻りたい時には次のようにできます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController3: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func doneButtonTapped(_ sender: Any) {&lt;br&gt;        if let viewControllers: [UIViewController] = self.navigationController?.viewControllers {&lt;br&gt;            self.navigationController?.popToViewController(viewControllers[viewControllers.count - 3], animated: true)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;まず、10 行目で、ナビゲーションコントローラのスタックにある View Controller の配列を取得しています。&lt;br&gt;&lt;br&gt;一番最後に現在の画面が入っているので、二つ前の画面に戻りたい時は viewControllers[viewControllers.count - 3] で二つ前の View Controller が取得できます。&lt;br&gt;&lt;br&gt;viewControllers[viewControllers.count - 1]: 現在の View Controller&lt;br&gt;viewControllers[viewControllers.count - 2]: ひとつ前の View Controller&lt;br&gt;viewControllers[viewControllers.count - 3]: 二つ前の View Controller&lt;br&gt;viewControllers[viewControllers.count - 4]: 三つ前の View Controller&lt;br&gt;...&lt;br&gt;&lt;br&gt;存在しないインデックスを指定してしまうとエラーになりますのでご注意ください。&lt;br&gt;&lt;br&gt;これで、ナビゲーションスタックから View Controller ポップされて、二つ前の No. 1 の画面に戻ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でルート View Controller に戻る方法&lt;br&gt;Swift で、ナビゲーションコントローラーを使った画面遷移で最初の画面に戻るには、ナビゲーションコントローラの popToRootViewControllerメソッドが使えます。&lt;br&gt;&lt;br&gt;例えば、三つ目の画面の DONE ボタンをタップした時に、二つ前の画面に戻りたい時、戻り先は最初の画面なので、次のようにしても同じ動きになります。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController3: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func doneButtonTapped(_ sender: Any) {&lt;br&gt;        self.navigationController?.popToRootViewController(animated: true)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;self.navigationController?.popToRootViewController(animated: true) でナビゲーションスタックから Root View Controller 以外の View Controller を全てポップして、最初の画面に戻ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で、ナビゲーションコントローラーを使った画面遷移で前の画面に戻る方法をご説明しました。</description><pubDate>Fri, 10 Dec 2021 11:04:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS - Navigation Bar が表示されなくなった時の対処方法</title><link>https://softmoco.com/devenv/ios-xcode-navigation-bar-not-showing.php</link><description>iOS - Navigation Bar が表示されなくなった時の対処方法&lt;br&gt;&lt;br&gt; &lt;br&gt;Navigation Bar が消えた？&lt;br&gt;ある日プロジェクトを Xcode を開いたら、今ままで表示されていた Navigation Bar の色が消えて、表示されなくなっていました。&lt;br&gt;&lt;br&gt;調べてみると、iOS 15 のナビゲーションバーの transparency のデフォルト設定の変更によるものでした。&lt;br&gt;&lt;br&gt;ここでは Xcode のストーリーボードで、どのようにして iOS 14 の時と同様の見た目のナビゲーションバーに戻したのかをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Navigation Bar が表示されなくなった時の対処方法&lt;br&gt;まず、プロジェクトを Xcode で開いて、 Navigation Contoller の Navigation Bar をストーリーボードで選択します。&lt;br&gt;&lt;br&gt;iOS - Navigation Bar が表示されなくなった時の対処方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この iOS アプリはナビゲーションバーの背景色に赤っぽい色を、タイトルのフォントの色は白で Verdana Bold 20.0 に指定しています。&lt;br&gt;&lt;br&gt;Attribute インスペクターで変更前の値を見るとこんな感じでした。&lt;br&gt;&lt;br&gt;iOS - Navigation Bar が表示されなくなった時の対処方法 11&lt;br&gt;&lt;br&gt;以前は Bar Tint、Title Font、Title Color を設定すれば、ナビゲーションバーに反映されていました。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS 15 で同じような見た目のナビゲーションバーにするには、まず Attribute インスペクターの Appearances で Standard と Scroll Edge を選択します。&lt;br&gt;&lt;br&gt;iOS - Navigation Bar が表示されなくなった時の対処方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;そして、Standard Appearance の Background に背景色を、Standard Title Attributes にタイトルのフォントと色を設定します。&lt;br&gt;&lt;br&gt;iOS - Navigation Bar が表示されなくなった時の対処方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;同様に、Scroll Edge Appearance の Background と Scroll Edge Title Attributes に Standard Appearance と同じ設定します。&lt;br&gt;&lt;br&gt;iOS - Navigation Bar が表示されなくなった時の対処方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、以前と同じ見た目のナビゲーションバーになりました。&lt;br&gt;&lt;br&gt;iOS - Navigation Bar が表示されなくなった時の対処方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Navigation Bar が表示されなくなった時の対処方法をご紹介しました。</description><pubDate>Wed, 01 Dec 2021 18:47:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>iOS アプリで地図を表示する方法 (Swift)</title><link>https://softmoco.com/basics/how-to-display-map-in-ios-app.php</link><description>iOS アプリで地図を表示する方法 (Swift)&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、iOS アプリで地図を表示する方法をご説明します。&lt;br&gt;&lt;br&gt;前回「iOS アプリで現在地情報を取得する方法」で、現在地を取得するアプリを作りましたが、今回はそれに以下のように現在地を示す地図を追加します。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 1&lt;br&gt;&lt;br&gt;現在地を取得するアプリができている前提ですすめますが、現在地でなくても、緯度と経度の情報があれば地図は表示できます。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;現在地を取得する iOS アプリに Map Kit View を追加する&lt;br&gt;iOS アプリで地図を表示する方法&lt;br&gt;シミュレーターで地図を表示するアプリのテストをする&lt;br&gt;現在地を取得する iOS アプリに Map Kit View を追加する&lt;br&gt;「iOS アプリで現在地情報を取得する方法」 で作った、現在地を表示する iOS アプリに Map View を追加します。&lt;br&gt;&lt;br&gt;Xcode でプロジェクトを開いて、Main ストーリーボードを表示します。&lt;br&gt;&lt;br&gt;&lt;br&gt;オブジェクトライブラリから Map Kit View を検索して、View Controller の位置情報を表示するラベルと Get Current Location ボタンの間に追加します。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;追加した Map Kit View から mapView という名前でアウトレットを生成しておきます。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 3&lt;br&gt;&lt;br&gt;@IBOutlet weak var mapView: MKMapView!&lt;br&gt;オブジェクトの追加の方法や、アウトレットの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリで地図を表示する方法&lt;br&gt;それでは、Swift で 地図を表示するコードを書いていきましょう。&lt;br&gt;&lt;br&gt;「iOS アプリで現在地情報を取得する方法」で書いたコードに追加していきますが、現在地を取得するコードがなくても、緯度と経度の情報さえあれば地図は表示できますので、後ほどご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;地図を表示するには、MapKit というフレームワークを使うので、MapKit をインポートします。&lt;br&gt;&lt;br&gt;import MapKit&lt;br&gt;&lt;br&gt;現在地あたりの地図を表示して、現在地にピンを立てるために ViewController クラスの locationManager(_:didUpdateLocations:) に、次のコードを追加します。&lt;br&gt;&lt;br&gt;let cr = MKCoordinateRegion(center: loc.coordinate, latitudinalMeters: 500, longitudinalMeters: 500)&lt;br&gt;mapView.setRegion(cr, animated: true)&lt;br&gt;&lt;br&gt;let pa = MKPointAnnotation()&lt;br&gt;pa.title = &quot;I&#039;m here!&quot;&lt;br&gt;pa.coordinate = loc.coordinate&lt;br&gt;mapView.removeAnnotations(mapView.annotations)&lt;br&gt;mapView.addAnnotation(pa)&lt;br&gt;1 行目では、mapView に表示される範囲となる MKCoordinateRegion を生成しています。&lt;br&gt;&lt;br&gt;引数の center には範囲の中心を示す CLLocationCoordinate2D を指定します。ここでは loc に取得した現在地の情報が入っています。&lt;br&gt;&lt;br&gt;現在地でなくても、緯度と経度の情報があれば let loc = CLLocation(latitude: 35.6762, longitude: 139.6503) のようにして CLLocation を生成し、loc.coordinate で CLLocationCoordinate2D を指定できます。&lt;br&gt;&lt;br&gt;引数の latitudinalMeters と longitudinalMeters には表示する範囲を南北、東西でメートルで指定しています。&lt;br&gt;&lt;br&gt;2 行目で、mapView に表示範囲を設定しています。&lt;br&gt;&lt;br&gt;4 ~ 6 行目で現在地のピンとなる MKPointAnnotation 生成しています。title にピンに表示される言葉を設定し、coordinate にピンの位置を指定しています。&lt;br&gt;&lt;br&gt;7 行目で mapView のピンを一度全て削除しています。&lt;br&gt;&lt;br&gt;8 行目で先ほど生成したピンを mapView に追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上で、地図を表示するコードが書けました。完成した ViewController.swift は次の通りです。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import CoreLocation&lt;br&gt;import MapKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, CLLocationManagerDelegate {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var locationInfoLabel: UILabel!&lt;br&gt;    @IBOutlet weak var mapView: MKMapView!&lt;br&gt;    &lt;br&gt;    let locationManager = CLLocationManager()&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        locationManager.delegate = self&lt;br&gt;        locationManager.desiredAccuracy = kCLLocationAccuracyBest&lt;br&gt;        locationManager.requestWhenInUseAuthorization()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func getCurrentLocationTapped(_ sender: Any) {&lt;br&gt;        locationManager.requestLocation()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {&lt;br&gt;        guard let loc = locations.last else { return }&lt;br&gt;        &lt;br&gt;        CLGeocoder().reverseGeocodeLocation(loc, completionHandler: {(placemarks, error) in&lt;br&gt;            &lt;br&gt;            if let error = error {&lt;br&gt;                print(&quot;reverseGeocodeLocation Failed: \(error.localizedDescription)&quot;)&lt;br&gt;                return&lt;br&gt;            }&lt;br&gt;            &lt;br&gt;            if let placemark = placemarks?[0] {&lt;br&gt;                &lt;br&gt;                var locInfo = &quot;&quot;&lt;br&gt;                locInfo = locInfo + &quot;Latitude: \(loc.coordinate.latitude)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;Longitude: \(loc.coordinate.longitude)\n\n&quot;&lt;br&gt;                &lt;br&gt;                locInfo = locInfo + &quot;Country: \(placemark.country ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;State/Province: \(placemark.administrativeArea ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;City: \(placemark.locality ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;PostalCode: \(placemark.postalCode ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;Name: \(placemark.name ?? &quot;&quot;)&quot;&lt;br&gt;                &lt;br&gt;                self.locationInfoLabel.text = locInfo&lt;br&gt;            }&lt;br&gt;        })&lt;br&gt;        &lt;br&gt;        let cr = MKCoordinateRegion(center: loc.coordinate, latitudinalMeters: 500, longitudinalMeters: 500)&lt;br&gt;        mapView.setRegion(cr, animated: true)&lt;br&gt;        &lt;br&gt;        let pa = MKPointAnnotation()&lt;br&gt;        pa.title = &quot;I&#039;m here!&quot;&lt;br&gt;        pa.coordinate = loc.coordinate&lt;br&gt;        mapView.removeAnnotations(mapView.annotations)&lt;br&gt;        mapView.addAnnotation(pa)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {&lt;br&gt;        print(&quot;error: \(error.localizedDescription)&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;もし、Map Kit View に緯度経度を指定して地図を表示するだけであれば、以下のコードで可能です。&lt;br&gt;&lt;br&gt;許可の設定なども必要ありません。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import MapKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var mapView: MKMapView!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        let loc = CLLocation(latitude: 35.6762, longitude: 139.6503)&lt;br&gt;        let cr = MKCoordinateRegion(center: loc.coordinate, latitudinalMeters: 500, longitudinalMeters: 500)&lt;br&gt;        mapView.setRegion(cr, animated: true)&lt;br&gt;        &lt;br&gt;        let pa = MKPointAnnotation()&lt;br&gt;        pa.title = &quot;I&#039;m here!&quot;&lt;br&gt;        pa.coordinate = loc.coordinate&lt;br&gt;        mapView.removeAnnotations(mapView.annotations)&lt;br&gt;        mapView.addAnnotation(pa)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt; &lt;br&gt;シミュレーターで地図を表示するアプリのテストをする&lt;br&gt;作った iOS アプリをシミュレーターにインストールしてテストします。&lt;br&gt;&lt;br&gt;アプリが起動すると、まだ許可をしていなければ、次のようにロケーション情報を使う許可を求める画面が出てきますので、「Allow While Using App（App の使用中は許可）」をタップします。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;最初の画面が表示されるので、「Get Current Location」をタップすると、ラベルに現在地情報が取得され、Map Kit View に現在地の地図が表示されます。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 5&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターの Location は Apple になっていますが、Custom Location に変更して、緯度軽度を設定してテストすることも可能です。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;ちなみに、このシミュレーターの iPhone の言語設定を English (US) から日本語に変更すると、情報が日本語になります。&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリで地図を表示する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iOS アプリで地図を表示する方法をご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 07 May 2021 19:13:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリ - TestFlight 配布の方法</title><link>https://softmoco.com/devenv/ios-test-flight-distribution.php</link><description>iOS アプリ - TestFlight 配布の方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Apple Developer Program のアカウントで iOS アプリを TestFlight を使ってテスト用に配布する方法をご説明します。&lt;br&gt;&lt;br&gt; iOS アプリを TestFlight で配布するには、有料の Apple Developer Program に登録する必要があります。詳しくは「Apple Developer Program について」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、iOS アプリを TestFlight で配布する方法を順を追ってご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;TestFlight とは？&lt;br&gt;iOS の App Store 配布用の証明書を生成する&lt;br&gt;Mac で CSR (Certificate Signing Request) を生成する&lt;br&gt;App Store 配布用の証明書 (distribution certificate) を生成する&lt;br&gt;Mac に App Store 配布用の証明書をインストールする&lt;br&gt;iOS アプリの App ID を生成する&lt;br&gt;Xcode で Bundle Identifier を設定する&lt;br&gt;Apple Developer で iOS アプリの App ID を生成する&lt;br&gt;App Store 配布用の Provisioning Profile を生成する&lt;br&gt;Xcode で App Store 配布用 Provisioning Profile を設定する&lt;br&gt;App Store Connect にアプリを追加する&lt;br&gt;Xcode で iOS アプリを App Store Connect にアップロードする方法&lt;br&gt;iOS アプリを TestFlight で配布してテストをする&lt;br&gt;TestFlight の内部テスターと外部テスターについて&lt;br&gt;App Store Connect の Users and Access ででテスターを追加する&lt;br&gt;App Store Connect の TestFlight で内部テスターを登録する&lt;br&gt;TestFlight を iOS デバイスにインストールしてテストする&lt;br&gt;TestFlight とは？&lt;br&gt;TestFlight とは、ベータテスト用の iOS アプリを iOS の端末にインストールして、テストを行うための Apple のアプリです。&lt;br&gt;&lt;br&gt;TestFlight で iOS アプリを配信するためにには、Apple Developer Program のアカウントが必要になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリのディベロッパーは、開発した iOS アプリを App Store にアップロードして、テスターを設定します。&lt;br&gt;&lt;br&gt;テスターは、TestFlight を App Store からダウンロードしてインストールし、TestFlight のアプリからテストするアプリをインストールします。&lt;br&gt;&lt;br&gt;TestFlight でクラッシュレポートを確認したり、テスターからのフィードバックを受けることもできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS のアプリの有効期限は App Store にアプリをアップロードしてから 90 日間です。&lt;br&gt;&lt;br&gt;他の配布方法と比べると、比較的簡単に配布できるので、特に開発が完了していない段階で確認してもらいたい時などに便利です。&lt;br&gt;&lt;br&gt;内部テスターへの配布は審査は不要ですが、外部テスターへの配布したい時は審査が必要になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Apple Developer のサイトや Xcode の UI は変わっていくかもしれませんが、基本的な手順は変わらないと思いますので、ご参考になれば幸いです。</description><pubDate>Sat, 01 May 2021 00:33:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>UILabel と UITextField に余白 (padding) を追加する方法 (Swift)</title><link>https://softmoco.com/basics/how-to-add-padding-to-uilabel-and-uitextfield.php</link><description>UILabel と UITextField に余白 (padding) を追加する方法 (Swift)&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で UILabel と UITextField に余白 (padding) を追加する方法をご説明します。&lt;br&gt;&lt;br&gt;下の画面で、TextField 1 と Label 1 はデフォルトの余白のままで、TextField 2 と Label 2 は余白を追加したものです。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;テスト用 iOS アプリの準備をする&lt;br&gt;UITextField に余白 (padding) を追加する方法&lt;br&gt;UILabel に余白 (padding) を追加する方法&lt;br&gt;シミュレーターで実行して余白 (padding)の確認をする&lt;br&gt;テスト用 iOS アプリの準備をする&lt;br&gt;まずはテスト用に UILabel と UITextField に余白 (padding) を追加するための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に UITextField を二つと UILabel を二つ追加します。&lt;br&gt;&lt;br&gt;見やすいように、Background に色をつけて、Text にそれぞれ、TextField 1、TextField 2、Label 1、Label 2 と設定しておきました。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 2&lt;br&gt;&lt;br&gt;テキストフィールドやラベルの追加の方法がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;UITextField に余白 (padding) を追加する方法&lt;br&gt;まずは、UITextField に余白 (padding) を追加する方法です。&lt;br&gt;&lt;br&gt;やり方はいろいろありますが、ここでは、カスタムの UITextField を作る方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode のメニューから [File] &gt; [New] &gt; [File...] を選択します。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;[iOS] の [Cocoa Touch Class] を選択して [Next] ボタンをクリックします。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;お好きなクラス名を入力します。今回は CustomTextField にしました。 Subclass of を UITextField にして [Next] ボタンをクリックし、次の画面でファイルを生成してください。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;CustomTextField.swift ファイルが生成されました。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;TextField 2 のクラスを CustomTextField に変更します。&lt;br&gt;&lt;br&gt;ストーリーボードで、TextField 2 を選択した状態で、Identity Inspector を開き、カスタムクラスの Class を CustomTextField に設定しておきます。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;余白を追加するために、CustomTextField.swift を次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;@IBDesignable class CustomTextField: UITextField {&lt;br&gt;&lt;br&gt;    @IBInspectable var topPadding: CGFloat = 10&lt;br&gt;    @IBInspectable var bottomPadding: CGFloat = 10&lt;br&gt;    @IBInspectable var leftPadding: CGFloat = 10&lt;br&gt;    @IBInspectable var rightPadding: CGFloat = 10&lt;br&gt;    &lt;br&gt;    override open func textRect(forBounds bounds: CGRect) -&gt; CGRect {&lt;br&gt;        return bounds.inset(by: UIEdgeInsets.init(top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding))&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    override open func editingRect(forBounds bounds: CGRect) -&gt; CGRect {&lt;br&gt;        return bounds.inset(by: UIEdgeInsets.init(top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding))&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;5 ~ 8 行目では UIEdgeInsets という View 同士の間の距離を設定するオブジェクトを生成する際に使うプロパティを 4 つ定義しています。&lt;br&gt;&lt;br&gt;この数字が pading の量になり、デフォルトは上下左右 10 にしています。&lt;br&gt;&lt;br&gt;UITextField クラスの textRect() と editingRect() メソッドを override して、bounds に UIEdgeInsets を生成して設定することで、余白を追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;必須ではないですが、これらのプロパティを @IBInspectable として定義することで、Attribute Inspector に表示され設定できるようになります。&lt;br&gt;&lt;br&gt;また、CustomTextField クラスとを @IBDesignable として定義すると、カスタムプロパティ設定後に再レンダリングしたレイアウトをストーリーボードで確認することができます。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;UILabel に余白 (padding) を追加する方法&lt;br&gt;続いて、UILabel に余白 (padding) を追加する方法です。&lt;br&gt;&lt;br&gt;UITextField の時と同様の方法で、カスタムの UILabel を生成し、Label 2 のカスタムクラスに設定しておきます。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 9&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 10&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;余白を追加するために、CustomLabel.swift を次のように変更します。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;@IBDesignable class CustomLabel: UILabel {&lt;br&gt;    &lt;br&gt;    @IBInspectable var topPadding: CGFloat = 10&lt;br&gt;    @IBInspectable var bottomPadding: CGFloat = 10&lt;br&gt;    @IBInspectable var leftPadding: CGFloat = 10&lt;br&gt;    @IBInspectable var rightPadding: CGFloat = 10&lt;br&gt;    &lt;br&gt;    override func drawText(in rect: CGRect) {&lt;br&gt;        super.drawText(in: rect.inset(by: UIEdgeInsets.init(top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding)))&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    override var intrinsicContentSize: CGSize {&lt;br&gt;        var size = super.intrinsicContentSize&lt;br&gt;        size.height += (topPadding + bottomPadding)&lt;br&gt;        size.width += (leftPadding + rightPadding)&lt;br&gt;        return size&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;プロパティと @IBDesignable、@IBInspectable については UITextField の時と同様です。&lt;br&gt;&lt;br&gt;10 ~ 12 行目では UILabel クラスの drawText() メソッドを override して、Text を入れる rectangle に UIEdgeInsets を生成して設定することで、余白を追加しています。&lt;br&gt;&lt;br&gt;14 ~ 19行目では、intrinsicContentSize というインスタンスプロパティを override して、content サイズの height と width に余白分を追加して、layout system がコンテンツ＋余白のサイズでレイアウトするようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターで実行して余白 (padding)の確認をする&lt;br&gt;これで、iOS アプリをシミュレータで実行すると以下のようになります。&lt;br&gt;&lt;br&gt;TextField 2 と Label 2 には余白が入っていますね。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;TextField 1 と Label 1 も Identity Inspector で Custom Class を設定するだけで、デフォルトで同じ余白が入るようになるので、アプリ全体で余白を統一したい時に便利ですね。&lt;br&gt;&lt;br&gt;UILabel と UITextField に余白 (padding) を追加する方法 13&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で UILabel と UITextField に余白 (padding) を追加する方法をご説明しました。</description><pubDate>Tue, 13 Apr 2021 23:25:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリで現在地情報を取得する方法 (Swift)</title><link>https://softmoco.com/basics/how-to-get-current-location-in-ios-app.php</link><description>iOS アプリで現在地情報を取得する方法 (Swift)&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、iOS アプリで現在地情報を取得する方法をご説明します。&lt;br&gt;&lt;br&gt;今回は、以下のように Get Current Location というボタンをタップした時に、ラベルに現在地の情報を表示するだけのシンプルな iOS アプリを作ります。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;現在地を取得する iOS アプリの準備をする&lt;br&gt;iOS アプリで現在地情報を取得する方法&lt;br&gt;info.plist にロケーションサービス使用許可のための行を追加する&lt;br&gt;シミュレーターで現在地情報を取得するアプリのテストをする&lt;br&gt;現在地を取得する iOS アプリの準備をする&lt;br&gt;まずはテスト用にボタンをタップして、現在地を取得して表示するための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に、上から順番にラベル二つとボタンをひとつ追加します。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 2&lt;br&gt;&lt;br&gt;一つ目ラベルは Text を Current Location に変更しました。&lt;br&gt;&lt;br&gt;二つ目のラベルに現在地情報を表示するので、サイズを大きめにして Lines を 10 にし、Background に薄いグレーの色をつけました。&lt;br&gt;&lt;br&gt;ボタンは Text を Get Current Location に変更しました。&lt;br&gt;&lt;br&gt;ラベル・ボタンの追加の方法や、アウトレット・アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;アウトレットと、ボタンのアクションを生成します。&lt;br&gt;&lt;br&gt;二つ目のラベルから locationInfoLabel という名前でアウトレットを生成します。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;ボタンから、getCurrentLocationTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 4&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var locationInfoLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func getCurrentLocationTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;以上で、現在地を取得する iOS アプリの準備は終わりです。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリで現在地情報を取得する方法&lt;br&gt;それでは、Swift で 電現在地情報を取得するコードを書いていきましょう。&lt;br&gt;&lt;br&gt;位置情報を取得するには、CoreLocation というフレームワークを使うので、CoreLocation をインポートします。&lt;br&gt;&lt;br&gt;具体的には CLLocationManager クラスを使って、現在地を取得します。&lt;br&gt;&lt;br&gt;そして、ViewController で CLLocationManager からのイベント受け取るために、CLLocationManagerDelegate をコンフォームしておきます。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import CoreLocation&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, CLLocationManagerDelegate {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var locationInfoLabel: UILabel!&lt;br&gt;    &lt;br&gt;    let locationManager = CLLocationManager()&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        locationManager.delegate = self&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func getCurrentLocationTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;CLLocationManager から受け取ることができるイベントはいろいろありますが、今回は以下の二つを受け取るようにします。&lt;br&gt;&lt;br&gt;locationManager(_:didUpdateLocations:)  - 新しいロケーションデータが取得された時に実行されます。&lt;br&gt;locationManager(_:didFailWithError:)  - ロケーションデータが取得できなかった時に実行されます。&lt;br&gt;func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {&lt;br&gt;}&lt;br&gt;&lt;br&gt;続いて viewDidLoad() を次のように変更します。&lt;br&gt;&lt;br&gt;override func viewDidLoad() {&lt;br&gt;    super.viewDidLoad() &lt;br&gt;    locationManager.delegate = self&lt;br&gt;    locationManager.desiredAccuracy = kCLLocationAccuracyBest&lt;br&gt;    locationManager.requestWhenInUseAuthorization()&lt;br&gt;}&lt;br&gt;desiredAccuracy は精度の指標で、今回は精度の高い kCLLocationAccuracyBest にしましたが、精度を落とすとより早く位置情報を取得できる場合があるので、必要最低限のものを選ぶと良いかと思います。&lt;br&gt;&lt;br&gt;今回はアプリを使用している時のみ位置情報が取得できれば良いので、requestWhenInUseAuthorization() メソッドで、アプリの使用中のみロケーションサービスを使う許可をリクエストしています。&lt;br&gt;&lt;br&gt;常にロケーションサービスを使用したい時は requestAlwaysAuthorization() メソッドを実行してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回のアプリではボタンがタップされた時 getCurrentLocationTapped() で位置情報取得のリクエストをして、locationManager(_:didUpdateLocations:) で位置情報を取得し、リバースジオコーディングしてラベルに表示します。&lt;br&gt;&lt;br&gt;コードは次の通りです。&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;import CoreLocation&lt;br&gt;&lt;br&gt;class ViewController: UIViewController, CLLocationManagerDelegate {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var locationInfoLabel: UILabel!&lt;br&gt;    &lt;br&gt;    let locationManager = CLLocationManager()&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        locationManager.delegate = self&lt;br&gt;        locationManager.desiredAccuracy = kCLLocationAccuracyBest&lt;br&gt;        locationManager.requestWhenInUseAuthorization()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func getCurrentLocationTapped(_ sender: Any) {&lt;br&gt;        locationManager.requestLocation()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {&lt;br&gt;        guard let loc = locations.last else { return }&lt;br&gt;        &lt;br&gt;        CLGeocoder().reverseGeocodeLocation(loc, completionHandler: {(placemarks, error) in&lt;br&gt;            &lt;br&gt;            if let error = error {&lt;br&gt;                print(&quot;reverseGeocodeLocation Failed: \(error.localizedDescription)&quot;)&lt;br&gt;                return&lt;br&gt;            }&lt;br&gt;            &lt;br&gt;            if let placemark = placemarks?[0] {&lt;br&gt;                &lt;br&gt;                var locInfo = &quot;&quot;&lt;br&gt;                locInfo = locInfo + &quot;Latitude: \(loc.coordinate.latitude)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;Longitude: \(loc.coordinate.longitude)\n\n&quot;&lt;br&gt;                &lt;br&gt;                locInfo = locInfo + &quot;Country: \(placemark.country ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;State/Province: \(placemark.administrativeArea ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;City: \(placemark.locality ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;PostalCode: \(placemark.postalCode ?? &quot;&quot;)\n&quot;&lt;br&gt;                locInfo = locInfo + &quot;Name: \(placemark.name ?? &quot;&quot;)&quot;&lt;br&gt;                &lt;br&gt;                self.locationInfoLabel.text = locInfo&lt;br&gt;            }&lt;br&gt;        })&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {&lt;br&gt;        print(&quot;error: \(error.localizedDescription)&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;18 行目の locationManager.requestLocation() で位置情報取得のリクエストをしています。&lt;br&gt;&lt;br&gt;今回はボタンをタップした時に一度だけ位置情報を取得したいので、requestLocation() を使っていますが、続けて位置情報を取得したい時は startUpdatingLocation() でスタート、stopUpdatingLocation() でストップすることもできます。&lt;br&gt;&lt;br&gt;22 行目で位置情報を取得しています。locations 配列には、一番最新のロケーションは最後に入っているので last で最新のロケーションを取得しています。&lt;br&gt;&lt;br&gt;24 行目で CLGeocoder().reverseGeocodeLocation() メソッドを使って、取得した CLLocation データから国や市などの情報を取得しています。&lt;br&gt;&lt;br&gt;reverseGeocodeLocation の結果がエラーでなければ、33 ~ 41 行目で位置情報の文字列を生成し、43 行目で locationInfoLabel に表示しています。&lt;br&gt;&lt;br&gt;49 行目では locationManager(_:didFailWithError:) を受け取った時にエラーの内容を print しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得するコードの説明は以上です。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;info.plist にロケーションサービス使用許可のための行を追加する&lt;br&gt;先ほどのコードをそのまま実行すると、次のようなメッセージが output に表示され、位置情報は取得できません。&lt;br&gt;&lt;br&gt;This app has attempted to access privacy-sensitive data without a usage description. The app&#039;s Info.plist must contain an NSLocationWhenInUseUsageDescription key with a string value explaining to the user how the app uses this data&lt;br&gt;&lt;br&gt;info.plist に NSLocationWhenInUseUsageDescription (Privacy - Location When In Use Usage Description) の行を追加する必要があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;info.plist ファイルを開いて、欄外で右クリックをして [Add Row] を選択します。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Key に NSLocationWhenInUseUsageDescription を入力して、Value にユーザに位置情報の使用許可を求める際に表示される、位置情報の使用用途の説明を入力します。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;アプリの使用中だけではなく、常に位置情報を取得したい時は代わりに NSLocationAlwaysAndWhenInUseUsageDescription を追加してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターで現在地情報を取得するアプリのテストをする&lt;br&gt;作った iOS アプリをシミュレーターにインストールしてテストします。&lt;br&gt;&lt;br&gt;アプリが起動すると、次のようにロケーション情報を使う許可を求める画面が出てくるので「Allow While Using App（App の使用中は許可）」をタップします。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;最初の画面が表示されるので、「Get Current Location」をタップすると、現在地情報が取得され、ラベルに表示されます。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 8&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;シミュレーターの Location は Apple になっていますが、Custom Location に変更して、緯度軽度を設定してテストすることも可能です。&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 10&lt;br&gt;&lt;br&gt;iOS アプリで現在地情報を取得する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iOS アプリで現在地情報を取得する方法をご説明しました。&lt;br&gt;</description><pubDate>Fri, 09 Apr 2021 21:54:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリから電話をかける方法 (Swift)</title><link>https://softmoco.com/basics/how-to-make-a-phone-call-from-ios-app.php</link><description>iOS アプリから電話をかける方法 (Swift)&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で iOS アプリから電話をかける方法をご説明します。&lt;br&gt;&lt;br&gt;今回は、以下のような Call Test というボタンをタップした時に、以下のように指定した電話番号に電話をかけるアプリを作ります。&lt;br&gt;&lt;br&gt;OS アプリから電話をかける方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;電話をかける iOS アプリの準備をする&lt;br&gt;Swift で iOS アプリから電話をかける方法&lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;電話をかける iOS アプリの準備をする&lt;br&gt;まずはテスト用にボタンをタップして、電話をかけるための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Button をひとつ追加します。&lt;br&gt;&lt;br&gt;OS アプリから電話をかける方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;そのボタンから、callTestTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;OS アプリから電話をかける方法 3&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func callTestTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;ボタンの追加の方法や、アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で iOS アプリから電話をかける方法&lt;br&gt;それでは、Swift で iOS アプリから電話をかけるコードを書いていきましょう。&lt;br&gt;&lt;br&gt;先ほど、作った ViewController.swift の callTestTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func callTestTapped(_ sender: Any) {&lt;br&gt;    let phoneNumber = &quot;+81351598200&quot;&lt;br&gt;    guard let url = URL(string: &quot;tel://&quot; + phoneNumber) else { return }&lt;br&gt;    UIApplication.shared.open(url)&lt;br&gt;}&lt;br&gt;2 行目で定義した phoneNumber に電話をかけます。値は +81-3-5159-8200 のようにハイフンが入っていても大丈夫です。&lt;br&gt;&lt;br&gt;3 行目では、tel:// を指定して、電話をかけるための URL を生成しています。guard let で生成に失敗したら return するようにしています。&lt;br&gt;&lt;br&gt;4 行目で UIApplication.shared.open() メソッドに、生成した url を渡して、電話をかけるアプリを起動しています。&lt;br&gt;&lt;br&gt;インストールされるデバイスに tel:// をハンドルできるアプリが存在している前提です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で iOS アプリから電話をかけるコードはこれだけです。&lt;br&gt;&lt;br&gt;info.plist に、アクセス許可などを追加する必要はありません。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリを iPhone にインストールしてテストする&lt;br&gt;電話をかけるテストはシミュレーターでできないので、電話がかけられる iPhone にインストールしてテストします。&lt;br&gt;&lt;br&gt;作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;iPhone を指定してこのアプリを実行すると、以下のような画面が表示されます。&lt;br&gt;&lt;br&gt;OS アプリから電話をかける方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;Call Test ボタンをクリックすると、電話する確認ダイアログが出てきます。&lt;br&gt;&lt;br&gt;OS アプリから電話をかける方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Call +81 3 5159 8200 のほうをタップすると、電話がかかります。&lt;br&gt;&lt;br&gt;OS アプリから電話をかける方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリから電話をかける方法をご説明しました。</description><pubDate>Wed, 07 Apr 2021 22:54:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>SQLite のデータ型</title><link>https://softmoco.com/sqlite/sqlite-data-types.php</link><description>SQLite のデータ型&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、 SQLite のデータ型についてご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;SQLite のデータ型について&lt;br&gt;SQLite でサポートされているデータ型&lt;br&gt;SQLite でサポートされていないデータ型&lt;br&gt;SQLite のデータ型について&lt;br&gt;SQLite のデータ型は、Oracle、SQL Server、MySQL などの代表的なリレーショナルデータベースマネージメントシステム(RDMBS)のようにカラムにつくのではなく、値につくような構造になっており、データ型を指定する必要はありません。&lt;br&gt;&lt;br&gt;ただ、カラムのデータ型を指定して使用することもでき、その場合は代表的な RDMBS のように、挿入した値をカラムで指定したデータ型に変換してくれます。&lt;br&gt;&lt;br&gt;このサイトでは、SQLite をできるだけ代表的な RDMBS と同じ方法で使っていきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQLite でサポートされているデータ型&lt;br&gt;SQLite 3 でサポートされている、値のデータ型には次のものがあります。&lt;br&gt;&lt;br&gt;SQLite の値のデータ型	&lt;br&gt;NULL	NULL&lt;br&gt;INTEGER	整数&lt;br&gt;REAL	浮動小数点数値&lt;br&gt;TEXT	文字列&lt;br&gt;BLOB	BLOB データ&lt;br&gt;&lt;br&gt;そして、SQLite 3 でサポートされている、カラムに指定できるデータ型には次のものがあります。&lt;br&gt;&lt;br&gt;SQLite データ型	他の RDMBS の対応するデータ型	&lt;br&gt;INTEGER	INT など	整数&lt;br&gt;NUMERIC	NUMERIC, DECIMAL など	数値&lt;br&gt;REAL	DOUBLE, FLOAT など	浮動小数点数値&lt;br&gt;TEXT	CHAR, VARCHAR など	文字列&lt;br&gt;BLOB	BLOB	BLOB データ&lt;br&gt;&lt;br&gt;SQLite でサポートされていないデータ型&lt;br&gt;比較的よくつかわれるデータ型で、SQLite でサポートされていないデータ型には次のようなものがあり、変換して保持する必要があります。&lt;br&gt;&lt;br&gt;データ型	&lt;br&gt;BOOL/BIT	0, 1 に変換して INTEGER として保持など。&lt;br&gt;DATETIME	文字列に変換して TEXT として保持、または UNIX 時間に変換して INTEGER として保持など。&lt;br&gt;&lt;br&gt;以上、SQLite のデータ型についてご紹介しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Thu, 04 Mar 2021 09:35:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>SQLite とは？</title><link>https://softmoco.com/sqlite/what-is-sqlite.php</link><description>SQLite とは？&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、 SQLite とは何かを簡単にご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;SQLite とは？&lt;br&gt;どんな時に SQLite がおすすめ？&lt;br&gt;SQLite とは？&lt;br&gt;SQLite とは？&lt;br&gt;&lt;br&gt;SQLite はパブリックドメインで誰でも無料で使える、軽量のリレーショナルデータベースマネージメントシステム(RDMBS) です。&lt;br&gt;&lt;br&gt;SQLite の特徴には以下のようなものがあります。&lt;br&gt;&lt;br&gt;Oracle, SQL Server, MySQL のようなクライアント・サーバー型ではなく、ひとつの SQLLite ファイルにデータベースシステムが含まれます。&lt;br&gt;クロスプラットフォームでいろんな環境で動かせ、SQLLite のファイルに全てが含まれているのでデータベースサーバの設定などが必要ありません。&lt;br&gt;軽量で処理が速く、アプリに組み込んで利用されることが多いデータベースシステムで、IoT のデバイスやスマホアプリなどにも良く使われています。&lt;br&gt;スタンダードな SQL のほとんどがサポートされています。&lt;br&gt;iOS アプリを開発するにあたって、データを保存するにはいろんなオプションがありますが、比較的データ量が多い時や、クエリーでデータを抽出したいような時に、SQLite を使うと便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;どんな時に SQLite がおすすめ？&lt;br&gt;先ほど「比較的データ量が多い時」と書きましたが、あくまで端末内に保存する程度のデータ量の話です。&lt;br&gt;&lt;br&gt;本当にデータ量が多い場合は SQLite ではなく、ネットワークを介してクライアント・サーバタイプのデータベースサーバに保存したほうが良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;私が最近開発した 業務用の iOS アプリでは、SQL Server にメインのデータベースがあり、アプリをオフラインでも使いたいという要望があったので、必要なデータだけをネットワークを介して取得し、SQLite に保存して使うようにしました。&lt;br&gt;&lt;br&gt;このような感じで、エンタープライズ RDBMS のキャッシュとしても SQLite がよく使われています。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリ内で使うのには考慮しなくてもよいかもしれませんが、一般的にビッグデータを扱う時や、たくさんの同時書き込みに対応しなければならないような時には、SQLite はおすすめされていません。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQLite とは何かを簡単にご紹介しました。</description><pubDate>Fri, 26 Feb 2021 10:12:00 GMT</pubDate><category>SQLite の使い方</category></item>
<item><title>iOS アプリにローディング画面を表示する方法</title><link>https://softmoco.com/basics/how-to-show-loading-screen-in-ios-app.php</link><description>iOS アプリにローディング画面を表示する方法 (Swift)&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で iOS アプリで時間のかかる処理をする時などに、処理中であることを知らせるための、次のようなローディング画面を表示する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;ローディング画面を表示する iOS アプリの準備をする&lt;br&gt;iOS アプリにローディング画面を表示する方法&lt;br&gt;iOS アプリにメッセージ付きのローディング画面を表示する方法&lt;br&gt;ローディング画面を表示する iOS アプリの準備をする&lt;br&gt;まずはテスト用にローディング画面を表示させるための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に &quot;START&quot; という Button をひとつ追加します。&lt;br&gt;&lt;br&gt;ボタンの追加の方法や、アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;そのボタンから、startTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 2&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func startTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;次に、View Controller を Navigaion Controller に Embed します。&lt;br&gt;&lt;br&gt;View Controller を選択した状態で右下の Embed in ボタンか、メニューの Editor &gt; Embed In から、Navigation Controller を選択して Embed してください。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;START ボタンをタップした時の遷移先の画面を作ります。&lt;br&gt;&lt;br&gt;Object Library から View Controller を追加してください。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;二つの View Controller 間の Segue を生成して、identifier を startSegue にしておきます。&lt;br&gt;&lt;br&gt;一つ目の View Controller から、⌃ Control キーを押しながら二つ目の View Controller にドラッグしてドロップすると、ポップアップが出てくるので、Manual Segue の Show を選択して、Segue を作成してください。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 5&lt;br&gt;&lt;br&gt;できた、Segue の identifier を startSegue に設定しておいてください。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 6&lt;br&gt;&lt;br&gt;これで、ローディング画面を表示する iOS アプリの準備ができました。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリにローディング画面を表示する方法&lt;br&gt;それでは、START ボタンをタップした際に、時間がかかる処理をして、次の画面に遷移するというような前提で、ローディング画面を表示してみましょう。&lt;br&gt;&lt;br&gt;まずは、メッセージなしの、ローディングアニメーション（インディケータ）のみのローディング画面を表示します。&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほど、作った ViewController.swift の startTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func startTapped(_ sender: Any) {&lt;br&gt;    let loadingView = UIView(frame: UIScreen.main.bounds)&lt;br&gt;    loadingView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)&lt;br&gt;    &lt;br&gt;    let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))&lt;br&gt;    activityIndicator.center = loadingView.center&lt;br&gt;    activityIndicator.color = UIColor.white&lt;br&gt;    activityIndicator.style = UIActivityIndicatorView.Style.large&lt;br&gt;    activityIndicator.hidesWhenStopped = true&lt;br&gt;    activityIndicator.startAnimating()&lt;br&gt;    loadingView.addSubview(activityIndicator)&lt;br&gt;    &lt;br&gt;    UIApplication.shared.windows.filter{$0.isKeyWindow}.first?.addSubview(loadingView)&lt;br&gt;    &lt;br&gt;    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {&lt;br&gt;        loadingView.removeFromSuperview()&lt;br&gt;        self.performSegue(withIdentifier: &quot;startSegue&quot;, sender: nil)&lt;br&gt;    })&lt;br&gt;}&lt;br&gt;2 ~ 3 行目で、loadingView という名前の背景が黒の半透明の UIView を生成しています。&lt;br&gt;&lt;br&gt;5 ~ 11 行目で、ローディングアニメーション（インディケータ）となる UIActivityIndicatorView を生成し、アニメーションを開始し、先ほどの loadingView の Subview に追加しています。&lt;br&gt;&lt;br&gt;13 行目で loadingView をメイン Window の Subview に追加して画面に表示しています。&lt;br&gt;&lt;br&gt;15 行目は時間のかかる処理をシミュレートするために、2 秒後に execute のコードが実行されるようにするためのものです。&lt;br&gt;&lt;br&gt;16 行目で loadingView を画面から削除し、17 行目で performSegue で、二つ目の画面に遷移しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これでアプリを実行し、START ボタンをタップすると、次のようなローディング画面が表示され、約 2 秒後に次の画面に遷移します。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリにメッセージ付きのローディング画面を表示する方法&lt;br&gt;続いて、先ほどのローディング画面に「ただいま処理中です...」というメッセージも表示してみましょう。&lt;br&gt;&lt;br&gt;ViewController.swift の startTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func startTapped(_ sender: Any) {&lt;br&gt;    let loadingView = UIView(frame: UIScreen.main.bounds)&lt;br&gt;    loadingView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)&lt;br&gt;    &lt;br&gt;    let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))&lt;br&gt;    activityIndicator.center = loadingView.center&lt;br&gt;    activityIndicator.color = UIColor.white&lt;br&gt;    activityIndicator.style = UIActivityIndicatorView.Style.large&lt;br&gt;    activityIndicator.hidesWhenStopped = true&lt;br&gt;    activityIndicator.startAnimating()&lt;br&gt;    loadingView.addSubview(activityIndicator)&lt;br&gt;    &lt;br&gt;    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 30))&lt;br&gt;    label.center = CGPoint(x: activityIndicator.frame.origin.x + activityIndicator.frame.size.width / 2, y: activityIndicator.frame.origin.y + 90)&lt;br&gt;    label.textColor = UIColor.white&lt;br&gt;    label.textAlignment = .center&lt;br&gt;    label.text = &quot;ただいま処理中です...&quot;&lt;br&gt;    loadingView.addSubview(label)&lt;br&gt;    &lt;br&gt;    UIApplication.shared.windows.filter{$0.isKeyWindow}.first?.addSubview(loadingView)&lt;br&gt;    &lt;br&gt;    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {&lt;br&gt;        loadingView.removeFromSuperview()&lt;br&gt;        self.performSegue(withIdentifier: &quot;startSegue&quot;, sender: nil)&lt;br&gt;    })&lt;br&gt;}&lt;br&gt;先ほどのコードに 13 ~ 18 行目が追加されています。&lt;br&gt;&lt;br&gt;メッセージの用の UILabel を作って、loadingView の Subview に追加しています。&lt;br&gt;&lt;br&gt;表示されるメッセージは label.text に設定します。メッセージの長さによって、ラベルの位置や大きさは調整してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;これでアプリを実行し START ボタンをタップすると、最初の動画のように「ただいま処理中です...」というメッセージの入ったローディング画面が表示され、約 2 秒後に次の画面に遷移します。&lt;br&gt;&lt;br&gt;iOS アプリにローディング画面を表示する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリにローディング画面を表示する方法についてご説明しました。</description><pubDate>Fri, 12 Feb 2021 00:45:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリにアラートメッセージを表示する方法</title><link>https://softmoco.com/basics/how-to-show-alert-message-in-ios-app.php</link><description>iOS アプリにアラートメッセージを表示する方法 (Swift)&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Swift で iOS アプリに次のようなアラートメッセージを表示する方法をご説明します。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;アラートメッセージを表示する iOS アプリの準備をする&lt;br&gt;iOS アプリにボタンが一個のアラートメッセージを表示する方法&lt;br&gt;iOS アプリにボタンが二個のアラートメッセージを表示する方法&lt;br&gt;iOS アプリにテキストボックがあるアラートメッセージを表示する方法&lt;br&gt;アラートメッセージを表示する iOS アプリの準備をする&lt;br&gt;まずはテスト用にアラートメッセージを表示させるための、簡単な iOS アプリを作ります。&lt;br&gt;&lt;br&gt;Xcode で [iOS] の [App] の新規プロジェクトを作成します。&lt;br&gt;&lt;br&gt;デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Button をひとつ追加します。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;そのボタンから、buttonTapped という名前で TouchUpInside のアクションを作っておきます。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 6&lt;br&gt;&lt;br&gt;import UIKit&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;&lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    @IBAction func buttonTapped(_ sender: Any) {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;ボタンの追加の方法や、アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリにボタンが一個のアラートメッセージを表示する方法&lt;br&gt;それでは、まずボタンがひとつのアラートメッセージを表示してみましょう。&lt;br&gt;&lt;br&gt;先ほど、作った ViewController.swift の buttonTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func buttonTapped(_ sender: Any) {&lt;br&gt;    let alert = UIAlertController(title: &quot;タイトル&quot;, message: &quot;アラートのメッセージです。&quot;, preferredStyle: .alert)&lt;br&gt;    alert.addAction(UIAlertAction(title: &quot;OK&quot;, style: .default))&lt;br&gt;    self.present(alert, animated: true, completion: nil)&lt;br&gt;}&lt;br&gt;2 行目で、title や message を指定して、UIAlertController を生成しています。&lt;br&gt;&lt;br&gt;3 行目では、UIAlertAction で OK ボタンを生成し、addAction() でアラートダイアログにその UIAlertAction を追加しています。&lt;br&gt;&lt;br&gt;4 行目でアラートダイアログを画面に表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これでアプリを実行すると、以下のようなアラートメッセージが表示され、OK ボタンをクリックするとダイアログが消えます。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリにボタンが二個のアラートメッセージを表示する方法&lt;br&gt;次は、ボタンが二個のアラートメッセージを表示してみましょう。&lt;br&gt;&lt;br&gt;確認用のアラートメッセージなどで、選択されたボタンによって、違うコードを実行したいような時に便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController.swift の buttonTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func buttonTapped(_ sender: Any) {&lt;br&gt;    let alert = UIAlertController(title: &quot;住所の削除&quot;, message: &quot;住所を削除してもよろしいですか？&quot;, preferredStyle: .alert)&lt;br&gt;    &lt;br&gt;    let delete = UIAlertAction(title: &quot;削除&quot;, style: .default, handler: { (action) -&gt; Void in&lt;br&gt;        print(&quot;Delete button tapped&quot;)&lt;br&gt;    })&lt;br&gt;    &lt;br&gt;    let cancel = UIAlertAction(title: &quot;キャンセル&quot;, style: .cancel, handler: { (action) -&gt; Void in&lt;br&gt;        print(&quot;Cancel button tapped&quot;)&lt;br&gt;    })&lt;br&gt;    &lt;br&gt;    alert.addAction(delete)&lt;br&gt;    alert.addAction(cancel)&lt;br&gt;    &lt;br&gt;    self.present(alert, animated: true, completion: nil)&lt;br&gt;}&lt;br&gt;2 行目は先ほどと同じで、title や message を指定して、UIAlertController を生成しています。&lt;br&gt;&lt;br&gt;4 ~ 6 行目では、UIAlertAction で削除ボタンを生成し、handler で削除ボタンがタップされた時に実行されるコードを指定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;8 ~ 10 行目では、UIAlertAction でキャンセルボタンを生成し、handler でキャンセルタンがタップされた時に実行されるコードを指定しています。&lt;br&gt;&lt;br&gt;12 ~ 13 行目で、生成した削除ボタンとキャンセルボタンの UIAlertAction を、UIAlertController に追加しています。&lt;br&gt;&lt;br&gt;15 行目でアラートダイアログを画面に表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これでアプリを実行すると、以下のようなアラートメッセージが表示されます。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;削除ボタンをクリックすると、Delete button tapped が、キャンセルボタンをクリックすると Cancel button tapped がデバッグエリアのコンソールに表示されます。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリにテキストボックがあるアラートメッセージを表示する方法&lt;br&gt;次は、ボタンが二個とテキストボックがあるアラートメッセージを表示してみましょう。&lt;br&gt;&lt;br&gt;メッセージを表示するのと同時に、ユーザーに何かを入力してもらいたいような時に使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;ViewController.swift の buttonTapped() を次のように変更します。&lt;br&gt;&lt;br&gt;@IBAction func buttonTapped(_ sender: Any) {&lt;br&gt;    let alert = UIAlertController(title: &quot;住所の削除&quot;, message: &quot;住所を削除してもよろしいですか？&quot;, preferredStyle: .alert)&lt;br&gt;    &lt;br&gt;    alert.addTextField(configurationHandler: { textField in&lt;br&gt;        textField.placeholder = &quot;パスワードを入力してください。&quot;&lt;br&gt;    })&lt;br&gt;&lt;br&gt;    let delete = UIAlertAction(title: &quot;削除&quot;, style: .default, handler: { (action) -&gt; Void in&lt;br&gt;        print(&quot;Delete button tapped&quot;)&lt;br&gt;        &lt;br&gt;        if let password = alert.textFields?.first?.text {&lt;br&gt;            print(&quot;Password: \(password)&quot;)&lt;br&gt;        }&lt;br&gt;    })&lt;br&gt;    &lt;br&gt;    let cancel = UIAlertAction(title: &quot;キャンセル&quot;, style: .cancel, handler: { (action) -&gt; Void in&lt;br&gt;        print(&quot;Cancel button tapped&quot;)&lt;br&gt;    })&lt;br&gt;    &lt;br&gt;    alert.addAction(delete);&lt;br&gt;    alert.addAction(cancel);&lt;br&gt;    &lt;br&gt;    self.present(alert, animated: true, completion: nil)&lt;br&gt;}&lt;br&gt;2 行目は先ほどと同じで、title や message を指定して、UIAlertController を生成しています。&lt;br&gt;&lt;br&gt;4 ~ 6 行目では、UIAlertController に addTextField() で placeholder を指定して、TextField を追加しています。&lt;br&gt;&lt;br&gt;8 ~ 14 行目では、UIAlertAction で削除ボタンを生成し、handler で削除ボタンがタップされた時に実行されるコードを指定しています。&lt;br&gt;&lt;br&gt;UIAlertController に追加した TextField には、alert.textFields でアクセスできます。 今回はひとつしか追加していないので、first でひとつめの TextField 取得し、その text を取得しています。 alert.textFields?[0].text でも大丈夫です。&lt;br&gt;&lt;br&gt;16 ~ 18 行目では、UIAlertAction でキャンセルボタンを生成し、handler でキャンセルタンがタップされた時に実行されるコードを指定しています。&lt;br&gt;&lt;br&gt;20 ~ 21 行目で、生成した削除ボタンとキャンセルボタンの UIAlertAction を、UIAlertController に追加しています。&lt;br&gt;&lt;br&gt;23 行目でアラートダイアログを画面に表示しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これでアプリを実行すると、以下のようなアラートメッセージが表示されます。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;テキストフィールドに test123 と入力して、削除ボタンをクリックすると、以下のようにデバッグエリアのコンソールに表示されます。&lt;br&gt;&lt;br&gt;iOS アプリにアラートメッセージを表示する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で iOS アプリにアラートメッセージを表示する方法についてご説明しました。</description><pubDate>Sat, 30 Jan 2021 01:10:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリにスプラッシュ画面を追加する方法</title><link>https://softmoco.com/basics/how-to-add-splash-screen-to-ios-app.php</link><description>iOS アプリにスプラッシュ画面を追加する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、iOS アプリにスプラッシュ画面を追加する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;iOS アプリのスプラッシュ画面とは？&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法&lt;br&gt;iOS アプリのスプラッシュ画面のテストをする&lt;br&gt;iOS アプリのスプラッシュ画面とは？&lt;br&gt;スプラッシュ画面というのは、アプリを起動した時に最初画面が表示されるまでに表示されている画面のことです。&lt;br&gt;&lt;br&gt;次の動画では、Softmoco と書かれているグレーの画面がスプラッシュ画面です。&lt;br&gt;&lt;br&gt;&lt;br&gt;アプリを起動して、すぐに最初の画面が表示される場合はなくてもいいかもしれませんが、少しでも起動に時間がかかるアプリの場合は真っ白な画面がしばらく表示されているよりも、スプラッシュ画面があったほうがよいと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法&lt;br&gt;iOS アプリにスプラッシュ画面は、コードを書かなくても追加できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のスクリーンショットは、Xcode から新規のプロジェクトを iOS の App で作成した直後のものです。&lt;br&gt;&lt;br&gt;デフォルトで Main.storyboard と LaunchScreen.storyboard という二つのストーリーボードが用意されています。&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Info.plist を見てもわかりますが、Main.storyboard はメインのストーリーボードファイルに、LaunchScreen.storyboard は起動画面のストーリーボードのファイルに指定されています。&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;この、LaunchScreen.storyboard を使って作った画面が、スプラッシュ画面として表示されます。&lt;br&gt;&lt;br&gt;作り方は Main.storyboard で画面を作るのと同じ感じで、オブジェクトライブラリからラベルや画像を追加したり、背景色を設定したりできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は View の背景色を Light Gray Color にして、Label をひとつ追加して、次のような感じで Softmoco という文字を配置しました。&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法 3&lt;br&gt;&lt;br&gt;これで、この画面がスプラッシュ画面として表示されます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;iOS アプリのスプラッシュ画面のテストをする&lt;br&gt;それでは、作ったスプラッシュ画面をテストしてみましょう。&lt;br&gt;&lt;br&gt;最初の画面が表示されたことがわかるように、Main.storyboard の Initial View Controller に First Screen というラベルを配置しました。&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;このままアプリを実行すると、すぐに最初の画面が表示されてしまって、スプラッシュ画面がよく見えません。&lt;br&gt;&lt;br&gt;少し起動に時間をかけるために、AppDelegate.swift の application(_:didFinishLaunchingWithOptions:) に、sleep(2) を追加して、2 秒間スレッドをスリープさせます。&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、アプリを実行すると動画のように、最初に Softmoco のグレーのスプラッシュ画面が表示されて、2秒くらいたってから、First Screen と書かれた最初の画面が表示されます。&lt;br&gt;&lt;br&gt;iOS アプリにスプラッシュ画面を追加する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、iOS アプリにスプラッシュ画面を追加する方法についてご説明しました。</description><pubDate>Wed, 27 Jan 2021 01:58:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>Swift で JSON の読み書き</title><link>https://softmoco.com/swift/swift-json.php</link><description>Swift で JSON の読み書き&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift で JSON の読み書きをする方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;JSON 文字列を Swift のオブジェクトへ変換する&lt;br&gt;JSON 文字列を追加のプロパティがある Swift のオブジェクトへ変換する&lt;br&gt;Swift のオブジェクトから JSON 文字列へ変換する&lt;br&gt;Swift のオブジェクトから特定のプロパティのみ JSON 文字列へ変換する&lt;br&gt;JSON 文字列を Swift のオブジェクトへ変換する&lt;br&gt;今回は JSONDecoder を使って、JSON の文字列から Swift の struct のオブジェクに変換する方法をご紹介します。&lt;br&gt;&lt;br&gt;次のような JSON 文字列を変換します。&lt;br&gt;&lt;br&gt;{&lt;br&gt;    &quot;name&quot;: &quot;Haruka&quot;,&lt;br&gt;    &quot;age&quot;: 20,&lt;br&gt;    &quot;email&quot;: &quot;haruka@mail.com&quot;&lt;br&gt;}&lt;br&gt;&lt;br&gt;JSON の情報を保持するための struct を定義します。&lt;br&gt;&lt;br&gt;JSONDecoder を使ってデコードするためには Decodable の protocol を conform していなければなりません。&lt;br&gt;&lt;br&gt;Codable は Decodable と Encodable のタイプエリアスなので、Codable を conform しても大丈夫です。&lt;br&gt;&lt;br&gt;次のような Person struct を定義しておきます。プロパティー名が JSON と合っていないとエラーになります。&lt;br&gt;struct Person: Decodable{&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    var email: String&lt;br&gt;}&lt;br&gt;&lt;br&gt;先ほどの JSON 文字列を JSONDecoder を使って、Person struct に変換するには次のようにできます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;struct Person: Decodable {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    var email: String&lt;br&gt;}&lt;br&gt;&lt;br&gt;let jsonData = &quot;&quot;&quot;&lt;br&gt;{&lt;br&gt;    &quot;name&quot;: &quot;Haruka&quot;,&lt;br&gt;    &quot;age&quot;: 20,&lt;br&gt;    &quot;email&quot;: &quot;haruka@mail.com&quot;&lt;br&gt;}&lt;br&gt;&quot;&quot;&quot;.data(using: .utf8)!&lt;br&gt;&lt;br&gt;let person = try JSONDecoder().decode(Person.self, from: jsonData)&lt;br&gt;&lt;br&gt;print(person.name)&lt;br&gt;print(person.age)&lt;br&gt;print(person.email)&lt;br&gt;実行結果は次のようになり、person オブジェクトに変換できているのがわかります。&lt;br&gt;&lt;br&gt;Haruka&lt;br&gt;20&lt;br&gt;haruka@mail.com&lt;br&gt;&lt;br&gt;JSON 文字列を追加のプロパティがある Swift のオブジェクトへ変換する&lt;br&gt;先ほどは、JSON と全く同じプロパティを持つ struct を定義して変換しましたが、struct に追加で他のプロパティを定義したいこともあると思います。&lt;br&gt;&lt;br&gt;上記のコードに struct に JSON にないプロパティを追加すると decode しようとした時にエラーになってしまいます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、上の Person struct に nickname というプロパティーを追加して実行すると以下のようなエラーになります。&lt;br&gt;&lt;br&gt;▿ DecodingError&lt;br&gt;  ▿ keyNotFound : 2 elements&lt;br&gt;    - .0 : CodingKeys(stringValue: &quot;nickname&quot;, intValue: nil)&lt;br&gt;    ▿ .1 : Context&lt;br&gt;      - codingPath : 0 elements&lt;br&gt;      - debugDescription : &quot;No value associated with key CodingKeys(stringValue: \&quot;nickname\&quot;, intValue: nil) (\&quot;nickname\&quot;).&quot;&lt;br&gt;      - underlyingError : nil&lt;br&gt;Swift で JSON の読み書き 1&lt;br&gt;&lt;br&gt;&lt;br&gt;このように JSON 文字列に含まれていないプロパティを持たせたい時には、その追加のプロパティに初期値を設定し、CodingKeys に JSON に含まれているデコードされるプロパティを定義することによって、エラーを出さずに decode することが可能です。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;struct Person: Decodable {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    var email: String&lt;br&gt;    var nickname: String = &quot;&quot;&lt;br&gt;    &lt;br&gt;    private enum CodingKeys: String, CodingKey {&lt;br&gt;        case name, age, email&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let jsonData = &quot;&quot;&quot;&lt;br&gt;{&lt;br&gt;    &quot;name&quot;: &quot;Haruka&quot;,&lt;br&gt;    &quot;age&quot;: 20,&lt;br&gt;    &quot;email&quot;: &quot;haruka@mail.com&quot;&lt;br&gt;}&lt;br&gt;&quot;&quot;&quot;.data(using: .utf8)!&lt;br&gt;&lt;br&gt;let person = try JSONDecoder().decode(Person.self, from: jsonData)&lt;br&gt;print(person.name)&lt;br&gt;print(person.age)&lt;br&gt;print(person.email)&lt;br&gt;実行結果は次の通りで、エラーにならずに decode されています。&lt;br&gt;&lt;br&gt;Haruka&lt;br&gt;20&lt;br&gt;haruka@mail.com&lt;br&gt;Swift で JSON の読み書き 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift のオブジェクトから JSON 文字列へ変換する&lt;br&gt;次は反対で、Swift のオブジェクトから JSON 文字列への変換してみましょう。&lt;br&gt;&lt;br&gt;今回は JSONEncoder を使って、Swift の struct から JSON 文字列を生成します。&lt;br&gt;&lt;br&gt;JSONEncoder を使ってデコードするためには Encodable の protocol を conform していなければなりません。&lt;br&gt;&lt;br&gt;Codable は Decodable と Encodable のタイプエリアスなので、Codable を conform しても大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Person struct のオブジェクトから JSON 文字列を生成するには次のようにできます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;struct Person: Encodable {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    var email: String&lt;br&gt;    var nickname: String&lt;br&gt;}&lt;br&gt;&lt;br&gt;let person = Person(name: &quot;Ryota&quot;, age: 16, email: &quot;ryota@gmail.com&quot;, nickname: &quot;Ryo&quot;)&lt;br&gt;&lt;br&gt;let encoder = JSONEncoder()&lt;br&gt;encoder.outputFormatting = .prettyPrinted&lt;br&gt;&lt;br&gt;let jsonData = try encoder.encode(person)&lt;br&gt;let jsonString = String(data: jsonData, encoding: .utf8)!&lt;br&gt;&lt;br&gt;print(jsonString)&lt;br&gt;実行結果は次のようになり、person からJSON 文字列に変換できていますね。&lt;br&gt;&lt;br&gt;{&lt;br&gt;  &quot;age&quot; : 16,&lt;br&gt;  &quot;email&quot; : &quot;ryota@gmail.com&quot;,&lt;br&gt;  &quot;nickname&quot; : &quot;Ryo&quot;,&lt;br&gt;  &quot;name&quot; : &quot;Ryota&quot;&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift のオブジェクトから特定のプロパティのみ JSON 文字列へ変換する&lt;br&gt;Swift のオブジェクトから特定のプロパティのみ JSON 文字列へ変換したい時には、CodingKeys を定義して JSON 含めたいプロパティを指定します。&lt;br&gt;&lt;br&gt;例えば、先ほどの Person struct のプロパティのうち、name と email のみを JSON 文字列に変換したいのであれば、次のようにできます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;struct Person: Encodable {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    var email: String&lt;br&gt;    var nickname: String&lt;br&gt;    &lt;br&gt;    private enum CodingKeys: String, CodingKey {&lt;br&gt;        case name, email&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let person = Person(name: &quot;Ryota&quot;, age: 16, email: &quot;ryota@gmail.com&quot;, nickname: &quot;Ryo&quot;)&lt;br&gt;&lt;br&gt;let encoder = JSONEncoder()&lt;br&gt;encoder.outputFormatting = .prettyPrinted&lt;br&gt;&lt;br&gt;let jsonData = try encoder.encode(person)&lt;br&gt;let jsonString = String(data: jsonData, encoding: .utf8)!&lt;br&gt;&lt;br&gt;print(jsonString)&lt;br&gt;実行結果は次のようになり、&quot;name&quot; と &quot;email&quot; のみが JSON 文字列に含まれています。&lt;br&gt;&lt;br&gt;{&lt;br&gt;  &quot;name&quot; : &quot;Ryota&quot;,&lt;br&gt;  &quot;email&quot; : &quot;ryota@gmail.com&quot;&lt;br&gt;}&lt;br&gt;Swift で JSON の読み書き 3&lt;br&gt;&lt;br&gt;Encodable ではなく Codable をコンフォームしている場合は、Decodable をコンフォームする為に、CodingKeys に含まれていないプロパティに初期値を設定する必要があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift で JSON の読み書きをする方法についてご説明しました。</description><pubDate>Fri, 04 Dec 2020 09:53:00 GMT</pubDate><category>Swift 便利メモ</category></item>
<item><title>Swift の class（クラス）</title><link>https://softmoco.com/swift-basics/swift-class.php</link><description>Swift の class（クラス）&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の class（クラス）についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の class の基本&lt;br&gt;Swift の class の使い方&lt;br&gt;Swift の class は参照型&lt;br&gt;Swift でクラスを継承して派生クラスを定義する&lt;br&gt;Swift の派生クラスにメソッドを追加する&lt;br&gt;Swift の基底クラスのメソッドをオーバーライドする&lt;br&gt;Swift の class の基本&lt;br&gt;Swift の class（クラス）では、struct と同様に、値を保持するためのプロパティや関連する機能のメソッドなどをまとめて定義しておいて、必要な時にその class のインスタンスを生成して使うことができます。&lt;br&gt;&lt;br&gt;class と struct の構文はほぼ同じですが、class は継承できたり、デイニシャライズが定義できるなどの違いがあります。&lt;br&gt;&lt;br&gt;プロパティの定義の箇所と init() でプロパティの初期値が設定でき、インスタンスが生成された時に初期化されていないプロパティーがあるとエラーになります。&lt;br&gt;&lt;br&gt;struct ではイニシャライザー init() を定義しなくても、デフォルトのイニシャライザーが自動的に生成されているような感じで使え、エラーになりませんでしたが、class では、プロパティの初期値がない状態でイニシャライザーがないとエラーになってしまいます。&lt;br&gt;&lt;br&gt;class のほうが多機能である分複雑で、Swift の公式ドキュメントでは特に必要がない限り struct を使うことがおすすめされています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;Swift の class（クラス）を定義するには、class キーワードを使って次のような構文で定義します。&lt;br&gt;&lt;br&gt;class Class名 {&lt;br&gt;    var プロパティ名1: データ型1&lt;br&gt;    var プロパティ名2: データ型2&lt;br&gt;&lt;br&gt;    init() {&lt;br&gt;        イニシャライザーのコードブロック&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    func メソッド名() {&lt;br&gt;        メソッドのコードブロック&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;例えば、名前と年齢をプロパティに持ち、あいさつをする greet メソッドを持つ、Person という class を定義したい時は次のようにできます。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;ちなみに、ディイニシャライザーを定義したい時は deinit { ... } のように定義します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の class の使い方&lt;br&gt;Swift の class のインスタンスを生成するには、基本的には次のようにできます。&lt;br&gt;&lt;br&gt;var または let 変数名 = Class名(プロパティ名1: プロパティ名1の値, プロパティ名2: プロパティ名2の値, ...)&lt;br&gt;&lt;br&gt;プロパティの値を変更したい時は、Class名.プロパティ名1 = 新しい値 のようにして変更できます。&lt;br&gt;&lt;br&gt;そして、メソッドを実行する際は Class名.メソッド名() のように実行します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、先ほど定義した Person クラスを使ってみましょう。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let person1 = Person(name: &quot;Ryota&quot;, age: 20)&lt;br&gt;person1.greet()&lt;br&gt;&lt;br&gt;let person2 = Person(name: &quot;Sayaka&quot;, age: 15)&lt;br&gt;person2.greet()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Hello! My name is Ryota, and I&#039;m 20 years old.&lt;br&gt;Hello! My name is Sayaka, and I&#039;m 15 years old.&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift の class は参照型&lt;br&gt;もう一点、Swift の class と struct の違いは、class は参照型で struct は値型であるという点です。&lt;br&gt;&lt;br&gt;例えば、次のように class をコピーして新しい class を生成し、新しく生成した class のプロパティーの値を変更すると、元の class のプロパティの値も変更されます。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;var p1 = Person(name: &quot;Haruka&quot;, age: 15)&lt;br&gt;&lt;br&gt;var p2 = p1&lt;br&gt;p2.age = 20&lt;br&gt;&lt;br&gt;p1.greet()&lt;br&gt;p2.greet()&lt;br&gt;実行結果は次のようになります。p2 の age を 20 に変更すると、p1 の age も 20 になっていますね。&lt;br&gt;&lt;br&gt;Hello! My name is Haruka, and I&#039;m 20 years old.&lt;br&gt;Hello! My name is Haruka, and I&#039;m 20 years old.&lt;br&gt;このコードの class を struct に変更して実行すると、p1 と p2 は別のインスタンスになるので、p2 の age を 20 に変更しても、p1 の age は 15 のままになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、struct では let でインスタンスを生成するとプロパティは変更できませんが、class では固定されているのは参照なので、プロパティの値が変更できます。&lt;br&gt;&lt;br&gt;以下のように上のコードのインスタンスを生成する時の var を let に変更して実行してもエラーになりません。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let p1 = Person(name: &quot;Haruka&quot;, age: 15)&lt;br&gt;&lt;br&gt;let p2 = p1&lt;br&gt;p2.age = 20&lt;br&gt;&lt;br&gt;p1.greet()&lt;br&gt;p2.greet()&lt;br&gt;実行結果は先ほどと同じです。&lt;br&gt;&lt;br&gt;Hello! My name is Haruka, and I&#039;m 20 years old.&lt;br&gt;Hello! My name is Haruka, and I&#039;m 20 years old.&lt;br&gt;&lt;br&gt;このコードの class を struct に変更して実行すると、p2 のプロパティの値を変更する箇所でエラーになります。&lt;br&gt;&lt;br&gt;Swift の class（クラス） 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でクラスを継承して派生クラスを定義する&lt;br&gt;Swift でクラスを継承して派生クラスを定義するには、クラスを定義する時に class 派生クラス名 : 基底クラス名 のようにします。&lt;br&gt;&lt;br&gt;また、派生クラスの init() メソッド内で、基底クラスの init() メソッドを呼ぶには super を使って、次のようにします。&lt;br&gt;&lt;br&gt;class DerivedClassName: ParentClassName {&lt;br&gt;    init() {&lt;br&gt;      super.init()&lt;br&gt;   }&lt;br&gt;}&lt;br&gt;&lt;br&gt;では、実際に Swift でクラスを継承して、派生クラスを定義して使ってみましょう。&lt;br&gt;&lt;br&gt;上で定義した Person クラスを継承した Employee という派生クラスを作ります。&lt;br&gt;&lt;br&gt;Employee クラスでは Person クラスが持つ name（名前）、age（年齢）に加えて、department（部署）というクラス変数を追加してみましょう。&lt;br&gt;&lt;br&gt;Employee クラスの init() の引数には name, age, department を指定し、基底クラスの super.init() には name と age のみを渡します。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;class Employee: Person {&lt;br&gt;    var department: String&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int, department: String) {&lt;br&gt;        self.department = department&lt;br&gt;        super.init(name: name, age: age)&lt;br&gt;   }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let emp1 = Employee(name: &quot;Haruka&quot;, age: 30, department: &quot;Sales&quot;)&lt;br&gt;&lt;br&gt;print(emp1.name)&lt;br&gt;print(emp1.age)&lt;br&gt;print(emp1.department)&lt;br&gt;emp1.greet()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Haruka&lt;br&gt;30&lt;br&gt;Sales&lt;br&gt;Hello! My name is Haruka, and I&#039;m 30 years old.&lt;br&gt;department に加え、Person のクラスから継承した name、age 変数や greet() メソッドが利用できていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift の派生クラスにメソッドを追加する&lt;br&gt;派生クラスの Employee にメソッドを追加してみましょう。&lt;br&gt;&lt;br&gt;社員の有給休暇の日数を保持する paidVacationDays という名前のクラス変数を使って初期値を 20 日に設定しておきます。&lt;br&gt;&lt;br&gt;そして、有給休暇を使う日数を渡して、有給休暇の日数が残っている場合は渡した日数を減らして残日数を表示、残っていなければ有給休暇の日数が足りないことを表示するような usePaidVacationDays() メソッドを追加し、使ってみましょう。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;class Employee: Person {&lt;br&gt;    var department: String&lt;br&gt;    var paidVacationDays: Int = 20&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int, department: String) {&lt;br&gt;        self.department = department&lt;br&gt;        super.init(name: name, age: age)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func usePaidVacationDays(days: Int) {&lt;br&gt;        if paidVacationDays &gt;= days {&lt;br&gt;            paidVacationDays -= days&lt;br&gt;            print(&quot;有給休暇の残日数は \(paidVacationDays) 日です。&quot;)&lt;br&gt;        } else {&lt;br&gt;            print(&quot;有給休暇の日数が足りません。&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let emp1 = Employee(name: &quot;Haruka&quot;, age: 30, department: &quot;Sales&quot;)&lt;br&gt;emp1.usePaidVacationDays(days: 3)&lt;br&gt;emp1.usePaidVacationDays(days: 20)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;有給休暇の残日数は 17 日です。&lt;br&gt;有給休暇の日数が足りません。&lt;br&gt;1 回目は 20 日から引数で渡した 3 を引いて、「有給休暇の残日数は 17 日です。」と出力されましたが、2 回目はもう 17 日しか残っていないのに 20 日分使おうとしたので、「有給休暇の日数が足りません。」と出力されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の基底クラスのメソッドをオーバーライドする&lt;br&gt;基底クラスのメソッドが派生クラスでやりたいことに合わない場合は、基底クラスのメソッドをオーバーライドすることができます。&lt;br&gt;&lt;br&gt;オーバーライドしたい時は派生クラスの中で override のキーワードを使って同じ名前でクラスメソッドを定義します。&lt;br&gt;&lt;br&gt;そうすると、その名前のメソッドが実行された時に、基底クラスのメソッドではなく、派生クラスのメソッドが実行されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、基底クラスの greet() メソッドをオーバーライドしたい時は次のようにします。&lt;br&gt;&lt;br&gt;class Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;class Employee: Person {&lt;br&gt;    var department: String&lt;br&gt;    var paidVacationDays: Int = 20&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int, department: String) {&lt;br&gt;        self.department = department&lt;br&gt;        super.init(name: name, age: age)&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func usePaidVacationDays(days: Int) {&lt;br&gt;        if paidVacationDays &gt;= days {&lt;br&gt;            paidVacationDays -= days&lt;br&gt;            print(&quot;有給休暇の残日数は \(paidVacationDays) 日です。&quot;)&lt;br&gt;        } else {&lt;br&gt;            print(&quot;有給休暇の日数が足りません。&quot;)&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    override func greet() {&lt;br&gt;        print(&quot;Hello, I&#039;m \(name). I work in the \(department.lowercased()) department.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let emp1 = Employee(name: &quot;Haruka&quot;, age: 30, department: &quot;Sales&quot;)&lt;br&gt;emp1.greet()&lt;br&gt;実行結果は次のようになり、基底クラスではなく派生クラスの greet() メソッドが実行されていますね。&lt;br&gt;&lt;br&gt;Hello, I&#039;m Haruka. I work in the sales department.&lt;br&gt;&lt;br&gt;以上、Swift の class（クラス）についてご説明しました。&lt;br&gt;</description><pubDate>Thu, 03 Dec 2020 09:29:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の struct（構造体）</title><link>https://softmoco.com/swift-basics/swift-struct.php</link><description>Swift の struct（構造体）&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の struct（構造体）についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の struct の基本&lt;br&gt;Swift の struct の使い方&lt;br&gt;Swift の struct は値型&lt;br&gt;Swift の struct の基本&lt;br&gt;Swift の struct（構造体）では、値を保持するためのプロパティや関連する機能のメソッドなどをまとめて定義しておいて、必要な時にその struct のインスタンスを生成して使うことができます。&lt;br&gt;&lt;br&gt;struct と class の構文は同じですが、struct のほうは継承やデイニシャライズができないなどの違いがあります。&lt;br&gt;&lt;br&gt;struct ではイニシャライザー init() を自分で定義することもできますが、定義しなくてもエラーにならず、デフォルトのイニシャライザーがついてくる感じで、インスタンス生成時にプロパティの値を引数として渡すことができます。&lt;br&gt;&lt;br&gt;class のほうが多機能である分複雑で、Swift の公式ドキュメントでは特に必要がない限り struct を使うことがおすすめされています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の struct（構造体）を定義するには、struct キーワードを使って次のような構文で定義します。&lt;br&gt;&lt;br&gt;struct Struct名 {&lt;br&gt;    var プロパティ名1: データ型1&lt;br&gt;    var プロパティ名2: データ型2&lt;br&gt;&lt;br&gt;    func メソッド名() {&lt;br&gt;        メソッドのコードブロック&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;例えば、名前と年齢をプロパティに持ち、あいさつをする greet メソッドを持つ、Person という struct を定義したい時は次のようにできます。&lt;br&gt;&lt;br&gt;struct Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;Swift の struct の使い方&lt;br&gt;Swift の struct のインスタンスを生成するには、基本的には次のようにできます。&lt;br&gt;&lt;br&gt;var 変数名 = Struct名(プロパティ名1: プロパティ名1の値, プロパティ名2: プロパティ名2の値, ...)&lt;br&gt;他のデータ型と同様に、変更する必要がない時は let 定数名 = ... でも大丈夫です。&lt;br&gt;&lt;br&gt;プロパティには初期値が設定できますが、初期値がない時は、インスタンスを生成する時にプロパティの値を渡す必要があります。&lt;br&gt;&lt;br&gt;初期値がある時は、インスタンス生成時の引数はオプショナルになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;プロパティの値を変更したい時は、Struct名.プロパティ名1 = 新しい値 のようにして変更できます。&lt;br&gt;&lt;br&gt;そして、メソッドを実行する際は Struct名.メソッド名() のように実行します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、先ほど定義した Person 構造体を使ってみましょう。&lt;br&gt;&lt;br&gt;struct Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;var p1 = Person(name: &quot;Haruka&quot;, age: 15)&lt;br&gt;p1.greet()&lt;br&gt;&lt;br&gt;p1.age = 20&lt;br&gt;p1.greet()&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Hello! My name is Haruka, and I&#039;m 15 years old.&lt;br&gt;Hello! My name is Haruka, and I&#039;m 20 years old.&lt;br&gt;&lt;br&gt;Swift の struct は値型&lt;br&gt;もう一点、Swift の struct と class の違いは、struct は値型で、class は参照型であるという点です。&lt;br&gt;&lt;br&gt;例えば、次のように struct をコピーして新しい struct を生成し、新しく生成した struct のプロパティーの値を変更しても、別のインスタンスなので元の struct のプロパティの値は変更されません。&lt;br&gt;&lt;br&gt;struct Person {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;    &lt;br&gt;    init(name: String, age: Int) {&lt;br&gt;        self.name = name&lt;br&gt;        self.age = age&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    func greet() {&lt;br&gt;        print(&quot;Hello! My name is \(name), and I&#039;m \(age) years old.&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;var p1 = Person(name: &quot;Haruka&quot;, age: 15)&lt;br&gt;&lt;br&gt;var p2 = p1&lt;br&gt;p2.age = 20&lt;br&gt;&lt;br&gt;p1.greet()&lt;br&gt;p2.greet()&lt;br&gt;実行結果は次のようになります。p2 の age を 20 に変更しても、p1 の age は 15 のままになっていますね。&lt;br&gt;&lt;br&gt;Hello! My name is Haruka, and I&#039;m 15 years old.&lt;br&gt;Hello! My name is Haruka, and I&#039;m 20 years old.&lt;br&gt;Swift の struct（構造体） 1&lt;br&gt;&lt;br&gt;このコードの struct を class に変更して実行すると、p1 と p2 は同じインスタンスへの参照になるので、p2 の age を 20 に変更すると、p1 の age も 20 になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の struct（構造体）についてご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Mon, 30 Nov 2020 10:58:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の命名規則</title><link>https://softmoco.com/swift-basics/swift-naming-conventions.php</link><description>Swift の命名規則&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の命名規則についてご紹介します。&lt;br&gt;&lt;br&gt;プログラミングの命名規則というのは、プログラムを書くときに、変数や関数、クラスなどに名前をつける時のルールのことです。&lt;br&gt;&lt;br&gt;名前付けのルールに従わなくてもプログラムは動くことが多いですが、できるだけそれそれの言語で推奨されている命名規則に従ったほうが良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;命名規則につかわれる用語&lt;br&gt;Swift の命名規則&lt;br&gt;命名規則につかわれる用語&lt;br&gt;まずは、一般的にプログラミングの命名規則で共通に使われる用語についてご紹介しておきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;パスカルケース（アッパーキャメルケース）&lt;br&gt;単語をつなげる時に、各単語の最初の文字を大文字にする命名規則です。 例: GetMethodName&lt;br&gt;&lt;br&gt;キャメルケース（ローワーキャメルケース）&lt;br&gt;単語をつなげる時に、最初の一文字は小文字ではじめ、続く各単語の最初の文字を大文字にする命名規則です。 例: getMethodName&lt;br&gt;&lt;br&gt;スネークケース&lt;br&gt;単語をつなげる時に、全部小文字で書き、単語と単語の間をアンダースコア _ でつなげる命名規則です。 例: get_method_name&lt;br&gt;&lt;br&gt;ケバブケース&lt;br&gt;単語をつなげる時に、全部小文字で書き、単語と単語の間をハイフン - でつなげる命名規則です。 例: get-method-name&lt;br&gt;&lt;br&gt;&lt;br&gt;パスカルケース（アッパーキャメルケース）とキャメルケース（ローワーキャメルケース）は単語ごとの最初の大文字がらくだのこぶのようなので、キャメル（らくだ）ケースという名前になったそうです。&lt;br&gt;&lt;br&gt;ケバブケースは単語がが串刺しにされたように見えますし、スネークケースは地をはっている感じが出ていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の命名規則&lt;br&gt;Swift の名前付けルールは以下のものが推奨されています。&lt;br&gt;&lt;br&gt;名前をつけるもの	命名規則	例&lt;br&gt;変数	キャメルケース	variableName&lt;br&gt;定数	キャメルケース	constantName&lt;br&gt;関数	キャメルケース	functionName&lt;br&gt;関数の引数	キャメルケース	functionParameterName&lt;br&gt;enum（列挙型）	パスカルケース	EnumName&lt;br&gt;構造体	パスカルケース	StructName&lt;br&gt;クラス	パスカルケース	ClassName&lt;br&gt;クラス変数	キャメルケース	classVariableName&lt;br&gt;メソッド	キャメルケース	methodName&lt;br&gt;プロトコル	パスカルケース	ProtocolName&lt;br&gt;&lt;br&gt;以上、Swift の命名規則についてご紹介しました。</description><pubDate>Thu, 19 Nov 2020 00:28:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の enum（列挙型）</title><link>https://softmoco.com/swift-basics/swift-enum.php</link><description>Swift の enum（列挙型）&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の enum（列挙型）についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の enum（列挙型）とは？&lt;br&gt;Swift の enum を定義する&lt;br&gt;Swift の enum を switch 文で使う&lt;br&gt;Swift の enum を引数として渡す&lt;br&gt;Swift の enum を Associated Values を指定して使う&lt;br&gt;Swift の enum を Raw Values を指定して使う&lt;br&gt;Swift の enum（列挙型）とは？&lt;br&gt;Swift の enum（列挙型）は、関係する複数の値をまとめてグループ化したようなものです。&lt;br&gt;&lt;br&gt;コードを書く時に、変数に保持したり、引数で渡したりする値の候補が限られている時などにも、String 型にしてなんでも扱えるようにしておくよりも、enum を定義して、その enum の型を指定しておくことで、コードがわかりやすく、間違いも少なくなります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、move() という関数に up, down, left, right のどれかを引数として受け取って処理をしたいとします。&lt;br&gt;&lt;br&gt;その時、引数を String 型にして受け取ることも可能ですが、そうすると呼び出し側で間違えて &quot;rigth&quot; を渡してもエラーにならず気がつかない、なんてことになるかもしれません。&lt;br&gt;&lt;br&gt;そういう時に enum を定義して、それを引数のデータ型として指定しておけば、わかりやすいコードになり、不具合も少なくなります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の enum を定義する&lt;br&gt;Swift の enum（列挙型）を定義するには enum と case というキーワードを使って次のようにします。&lt;br&gt;&lt;br&gt;enum [enum 名] {&lt;br&gt;    case [enum 値1]&lt;br&gt;    case [enum 値2]&lt;br&gt;    case [enum 値3]&lt;br&gt;}&lt;br&gt;&lt;br&gt; &lt;br&gt;C 言語や Objective-C などと違って、Swift ではデフォルトで enum 値に整数の値は割当られません。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、例にあげた move() という関数に渡す enum を Direction という名前で定義すると次のようになります。&lt;br&gt;&lt;br&gt;enum Direction {&lt;br&gt;    case up&lt;br&gt;    case down&lt;br&gt;    case left&lt;br&gt;    case right&lt;br&gt;}&lt;br&gt;次のように 1 行で定義しても同じ意味になります。&lt;br&gt;&lt;br&gt;enum Direction {&lt;br&gt;    case up, down, left, right&lt;br&gt;}&lt;br&gt;&lt;br&gt;enum 値をアサインしたり、比較したりする際は [enum 名].[enum 値] か、型が決まっている場合は [enum 名]は省略して、.[enum 値] のように指定できます。&lt;br&gt;&lt;br&gt;var d = Direction.right&lt;br&gt;d = .left&lt;br&gt;&lt;br&gt;Swift の enum を switch 文で使う&lt;br&gt;Swift の enum（列挙型）は、よく switch 文と一緒に使われます。&lt;br&gt;&lt;br&gt;例えば、d という Direction enum 型の変数を定義して、switch 文でその enum 値によって違う文字列を print するには次のようにできます。&lt;br&gt;&lt;br&gt;enum Direction {&lt;br&gt;    case up&lt;br&gt;    case down&lt;br&gt;    case left&lt;br&gt;    case right&lt;br&gt;}&lt;br&gt;&lt;br&gt;let d = Direction.right&lt;br&gt;&lt;br&gt;switch d {&lt;br&gt;case .up:&lt;br&gt;    print(&quot;Direction is up&quot;)&lt;br&gt;case .down:&lt;br&gt;    print(&quot;Direction is down&quot;)&lt;br&gt;case .left:&lt;br&gt;    print(&quot;Direction is left&quot;)&lt;br&gt;case .right:&lt;br&gt;    print(&quot;Direction is right&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Direction is right&lt;br&gt;&lt;br&gt;Swift の enum を引数として渡す&lt;br&gt;Swift の enum（列挙型）を引数として渡したい時は、引数のデータ型を指定する箇所で enum 名を指定します。&lt;br&gt;&lt;br&gt;例えば、先ほどの switch 文を move() という名前の関数にして、Direction を引数として渡したい時は次のようにできます。&lt;br&gt;&lt;br&gt;enum Direction {&lt;br&gt;    case up&lt;br&gt;    case down&lt;br&gt;    case left&lt;br&gt;    case right&lt;br&gt;}&lt;br&gt;&lt;br&gt;func move(direction: Direction) {&lt;br&gt;&lt;br&gt;    switch direction {&lt;br&gt;    case .up:&lt;br&gt;        print(&quot;Direction is up&quot;)&lt;br&gt;    case .down:&lt;br&gt;        print(&quot;Direction is down&quot;)&lt;br&gt;    case .left:&lt;br&gt;        print(&quot;Direction is left&quot;)&lt;br&gt;    case .right:&lt;br&gt;        print(&quot;Direction is right&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;move(direction: .down)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Direction is down&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift の enum を Associated Values を指定して使う&lt;br&gt;Swift の enum では associated value という関連する値を保持するように定義して使うことができます。&lt;br&gt;&lt;br&gt;例えば、先ほどの Direction という enum の値に Int でどれくらい進むかという associated value を持たせたい時には次のようにできます。&lt;br&gt;&lt;br&gt;switch 文では、case .[enum 値](let 定数名) のようにして、関連する値を定数に代入して使うことができます。&lt;br&gt;&lt;br&gt;enum Direction {&lt;br&gt;    case up(Int)&lt;br&gt;    case down(Int)&lt;br&gt;    case left(Int)&lt;br&gt;    case right(Int)&lt;br&gt;}&lt;br&gt;&lt;br&gt;let direction = Direction.down(2)&lt;br&gt;&lt;br&gt;switch direction {&lt;br&gt;case .up(let i):&lt;br&gt;    print(&quot;Direction is up - \(i)&quot;)&lt;br&gt;case .down(let i):&lt;br&gt;    print(&quot;Direction is down - \(i)&quot;)&lt;br&gt;case .left(let i):&lt;br&gt;    print(&quot;Direction is left - \(i)&quot;)&lt;br&gt;case .right(let i):&lt;br&gt;    print(&quot;Direction is right - \(i)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Direction is down - 2&lt;br&gt;今回は、全ての enum 値に Int 型の associated value をひとつずつ持たせるようにしましたが、複数でもかまいませんし、データ型は enum 値ごとに違っても大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の enum を Raw Values を指定して使う&lt;br&gt;定義の箇所でも言いましたが、Swift の enum では、C 言語や Objective-C などと違って、デフォルトで enum 値に整数の値は割当られません。&lt;br&gt;&lt;br&gt;各 enum 値に Int や String などの値を割り当てたい時は、raw value を指定することによって可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;定義する際に [enum 名]: データ型 のように指定して、case [enum 値] = [row value] のように値を指定します。&lt;br&gt;&lt;br&gt;そして、使うと時は [enum 値].rawValue のようにして、その値を取得できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;enum Direction1: Int {&lt;br&gt;    case up = 0&lt;br&gt;    case down&lt;br&gt;    case left&lt;br&gt;    case right&lt;br&gt;}&lt;br&gt;&lt;br&gt;let d1 = Direction1.left&lt;br&gt;print(d1.rawValue)&lt;br&gt;&lt;br&gt;enum Direction2: String {&lt;br&gt;    case up = &quot;UP&quot;&lt;br&gt;    case down = &quot;DOWN&quot;&lt;br&gt;    case left = &quot;LEFT&quot;&lt;br&gt;    case right = &quot;RIGHT&quot;&lt;br&gt;}&lt;br&gt;&lt;br&gt;let d2 = Direction2.left&lt;br&gt;print(d2.rawValue)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;2&lt;br&gt;LEFT&lt;br&gt;&lt;br&gt;以上、Swift の enum（列挙型）についてご説明しました。&lt;br&gt;</description><pubDate>Tue, 10 Nov 2020 00:59:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の関数</title><link>https://softmoco.com/swift-basics/swift-function.php</link><description>Swift の関数&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift のユーザー定義関数についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift のユーザー定義関数とは？&lt;br&gt;Swift のユーザー定義関数を定義する&lt;br&gt;Swift のユーザー定義関数の引数&lt;br&gt;Swift のユーザー定義関数の引数のデフォルト値&lt;br&gt;Swift のユーザー定義関数の可変長引数&lt;br&gt;Swift のユーザー定義関数の戻り値&lt;br&gt;ユーザー定義関数から複数の戻り値を返す&lt;br&gt;inout で引数を「参照渡し」にする&lt;br&gt;Swift のユーザー定義関数とは？&lt;br&gt;まず、プログラミングで関数というのは、特定の処理をするひとまとまりのコードに名前をつけて呼び出せるようにしたものです。&lt;br&gt;&lt;br&gt;引数というのは、実行時に関数に呼び出し元から渡される値とそれを受け取る関数側の変数のことです。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift には、既に定義された、たくさんの組み込み関数があり、必要に応じて呼び出して使うことができます。&lt;br&gt;&lt;br&gt;例えば、出力するのに良く使う print() もライブラリの組み込み関数です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でも、他のプログラミング言語と同様に、特定の処理をするひとまとまりのコードをユーザー定義関数として定義しておいて、呼び出して使うことができます。&lt;br&gt;&lt;br&gt;組み込み関数と同様に、ユーザー定義関数に引数を渡すこともできますし、戻り値を返すこともできます。&lt;br&gt;&lt;br&gt;プログラムを書いていて、繰り返し同じコードを書いているなと感じた時は、ユーザー定義関数を作って、それを呼び出すようにしたほうが良いことが多いです。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、Swift でユーザー定義関数について詳しく学んでいきましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift のユーザー定義関数を定義する&lt;br&gt;Swift で関数を定義するには、func というキーワードを使って、次のように定義します。&lt;br&gt;&lt;br&gt;func 関数名(引数名1: 引数1のデータ型, 引数名2: 引数2のデータ型, ...) -&gt; 戻り値のデータ型 {&lt;br&gt;    関数のコードブロック&lt;br&gt;    ...&lt;br&gt;    return 戻り値&lt;br&gt;}&lt;br&gt;引数と戻り値は必要なければ、なくて大丈夫です。&lt;br&gt;&lt;br&gt;関数を定義しただけでは、その中のコードは実行されず、呼び出されて初めて関数のコードが実行されます。&lt;br&gt;&lt;br&gt;ユーザー定義関数を呼び出す方法は組み込み関数と同じで、関数名(引数名1: 引数1, 引数名2: 引数2) のように呼び出せます。&lt;br&gt;&lt;br&gt;&lt;br&gt;呼び出し側で引数名を指定しないようにしたい時は、次のように引数の定義の箇所で _ を追加します。&lt;br&gt;&lt;br&gt;この場合、第一引数が引数名1に入って、第二引数が引数名2 に入って、関数のコードブロック内で利用できます。&lt;br&gt;&lt;br&gt;func 関数名(_ 引数名1: 引数1のデータ型, _ 引数名2: 引数2のデータ型, ...) -&gt; 戻り値のデータ型 {&lt;br&gt;    関数のコードブロック&lt;br&gt;    ...&lt;br&gt;    return 戻り値&lt;br&gt;}&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;では、まずは引数のない、Hello! という文字列を出力するだけのシンプルな greet という関数を定義して呼び出してみましょう。&lt;br&gt;&lt;br&gt;func greet() {&lt;br&gt;    print(&quot;Hello!&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;greet()&lt;br&gt;実行結果は次のようになります。  5 行目の greet() でユーザー定義関数が呼び出され、print(&quot;Hello!&quot;) が実行されます。&lt;br&gt;&lt;br&gt;Hello!&lt;br&gt;&lt;br&gt;Swift の ユーザー定義関数の引数&lt;br&gt;先ほどは、引数の無いユーザー関数を定義して、呼び出してみましたが、今度はユーザー定義関数に引数を渡してみましょう。&lt;br&gt;&lt;br&gt;greet() 関数に first_name と last_name という引数を追加して、それを出力するように変更すると次のようになります。&lt;br&gt;&lt;br&gt;func greet(fristName: String, lastName: String) {&lt;br&gt;    print(&quot;Hello! I&#039;m \(fristName) \(lastName).&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;greet(fristName: &quot;Jun&quot;, lastName: &quot;Sasaki&quot;)&lt;br&gt;greet(fristName: &quot;Ryo&quot;, lastName: &quot;Tanaka&quot;)&lt;br&gt;実行結果は次のようになります。渡した引数の値によって、出力される名前が変わっていますね。&lt;br&gt;&lt;br&gt;Hello! I&#039;m Jun Sasaki.&lt;br&gt;Hello! I&#039;m Ryo Tanaka.&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift のユーザー定義関数の引数のデフォルト値&lt;br&gt;ユーザー定義関数で定義した引数は必須で、呼び出す時に値を渡さないとエラーになります。&lt;br&gt;&lt;br&gt;関数を定義する時に引数にデフォルトの値を指定しておくことによって、関数を呼び出す時にその引数を省略することも可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、4 つの値を受け取って足すだけの関数を定義して、3つ目と４つ目の引数のデフォルト値を 0 にしてみましょう。&lt;br&gt;&lt;br&gt;func add(value1: Int = 1, value2: Int, value3: Int = 0, value4: Int = 0) {&lt;br&gt;    print(value1 + value2 + value3 + value4)&lt;br&gt;}&lt;br&gt;&lt;br&gt;add(value1: 1, value2: 2)&lt;br&gt;add(value1: 1, value2: 2, value3: 3)&lt;br&gt;add(value1: 1, value2: 2, value4: 4)&lt;br&gt;実行結果は次のようになり、add() を呼ぶ時に、デフォルトの指定されている引数は渡さなくてもエラーならず、渡さなかった引数は 0 として計算されていますね。&lt;br&gt;&lt;br&gt;3&lt;br&gt;6&lt;br&gt;7&lt;br&gt;&lt;br&gt;Swift のユーザー定義関数の可変長引数&lt;br&gt;引数の数が何個になるかわからない時には、引数のデータ型の後ろに ... をつけることによって、引数の数を可変にすることができます。&lt;br&gt;&lt;br&gt;... をつけると、引数を Array の定数として受け取り、インデックスを指定したり、ループをしたりすることによって、受け取ったそれぞれの引数が使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、values という名前で渡した数字を全て足した合計を出力するには、次のようにします。&lt;br&gt;&lt;br&gt;func add(values: Int...) {&lt;br&gt;    var total = 0&lt;br&gt;    for value in values {&lt;br&gt;        total += value&lt;br&gt;    }&lt;br&gt;    print(&quot;Total: \(total)&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;add(values: 1, 2, 3)&lt;br&gt;add(values: 1, 2, 3, 4, 5)&lt;br&gt;実行結果は次のようになります。 values の値の数が何個あっても Int である限りエラーにはならず、計算結果が出力されています。&lt;br&gt;&lt;br&gt;Total: 6&lt;br&gt;Total: 15&lt;br&gt;&lt;br&gt;Swift のユーザー定義関数の戻り値&lt;br&gt;ユーザー定義関数から戻り値を返すには引数に続いて「-&gt; 戻り値のデータ型」のようにデータ型を指定しておき、return 文で値を返します。&lt;br&gt;&lt;br&gt;例えば、先ほど引数で渡した数字を全て足して合計を出力した関数を、合計を戻り値として返すように変更すると次のようになります。&lt;br&gt;&lt;br&gt;func add(values: Int...) -&gt; Int {&lt;br&gt;    var total = 0&lt;br&gt;    for value in values {&lt;br&gt;        total += value&lt;br&gt;    }&lt;br&gt;    return total&lt;br&gt;}&lt;br&gt;&lt;br&gt;let total = add(values: 1, 2, 3, 4, 5)&lt;br&gt;print(&quot;Total: \(total)&quot;)&lt;br&gt;実行結果は次のようになり、add() 関数が total を戻り値として返しているのがわかりますね。&lt;br&gt;&lt;br&gt;Total: 15&lt;br&gt;&lt;br&gt; &lt;br&gt;ユーザー定義関数から複数の戻り値を返す&lt;br&gt;Swift のユーザー定義関数から複数の戻り値を返したい時は、タプルが使えます。&lt;br&gt;&lt;br&gt;例えば、name という文字列を受け取って、&quot; &quot; でスプリットし、二つに分けられた時だけ、ひとつめの文字列を lastName、ふたつめの文字列を firstName として戻り値として返したい時は次のようにできます。&lt;br&gt;&lt;br&gt;func splitName(name: String) -&gt; (lastName: String, firstName: String) {&lt;br&gt;    let names = name.split(separator: &quot; &quot;)&lt;br&gt;    if names.count == 2 {&lt;br&gt;        return(String(names[0]), String(names[1]))&lt;br&gt;    } else {&lt;br&gt;        return(&quot;&quot;, &quot;&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;let (lastName, firstName) = splitName(name: &quot;Saki Nagano&quot;)&lt;br&gt;print(&quot;lastName = \(lastName), firstName = \(firstName)&quot;)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;lastName = Saki, firstName = Nagano&lt;br&gt;呼び出し側の戻り値を受け取る箇所は let n = splitName(name: &quot;Saki Nagano&quot;) のようにして、n.lastName、n.firstName のように受け取った値を使うこともできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;inout で引数を「参照渡し」にする&lt;br&gt;Swift の入力引数が関数の中で変更できるか、また変更した値が関数の呼び側に反映されるかどうかというのは、そのデータ型が参照型かどうかで変わってきます。&lt;br&gt;&lt;br&gt;関数の中で入力引数が変更できるかは、let で定義した定数の値が変更できるかと同じです。&lt;br&gt;&lt;br&gt;例えば、class は参照型なので let で定義しても固定されているのはインスタンスへの参照で、その中のプロパティの値は変更できるので、引数として渡した場合、関数の中でもプロパティの値を変更でき、呼び出し側にもその変更が反映されます。&lt;br&gt;&lt;br&gt;Swift の関数 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift では、Int、String、Double などのベーシックなデータ型の他、Array、Struct、Enum、Tuple、Dictionary など全て参照型ではなく値型です。&lt;br&gt;&lt;br&gt;値型の入力引数を関数内で変更しようとするとエラーになり変更できません。&lt;br&gt;&lt;br&gt;&lt;br&gt;時には、値型の入力引数を「参照渡し」して、関数内で値を変更し、その変更を呼び出し側にも反映させたいことがあるかもしれません。&lt;br&gt;&lt;br&gt;そんな時は inout キーワードを入力の引数のデータ型の前につけ、呼び出し側の変数の前に &amp; をつけることによって、参照渡しにすることができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、先ほどの splitName という名前の関数の入力引数 name を参照渡しにして、split した結果が二つではなかった場合に引数を &quot;Invalid&quot; という文字で上書きしています。&lt;br&gt;&lt;br&gt;func splitName(name: inout String) -&gt; (lastName: String, firstName: String) {&lt;br&gt;    let names = name.split(separator: &quot; &quot;)&lt;br&gt;    if names.count == 2 {&lt;br&gt;        return(String(names[0]), String(names[1]))&lt;br&gt;    } else {&lt;br&gt;        name = &quot;Invalid&quot;&lt;br&gt;        return(&quot;&quot;, &quot;&quot;)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;var name = &quot;Saki&quot;&lt;br&gt;print(&quot;name before: \(name)&quot;)&lt;br&gt;&lt;br&gt;let nameSplit = splitName(name: &amp;name)&lt;br&gt;&lt;br&gt;print(&quot;name after: \(name)&quot;)&lt;br&gt;実行結果は次のようになり、関数を呼んだ後、name の値が変更されていることがわかります。&lt;br&gt;&lt;br&gt;name before: Saki&lt;br&gt;name after: Invalid&lt;br&gt;&lt;br&gt;以上、Swift のユーザー定義関数についてご説明しました。</description><pubDate>Thu, 05 Nov 2020 01:37:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Optional</title><link>https://softmoco.com/swift-basics/swift-optional.php</link><description>Swift の Optional&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Optional についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Optional とは？&lt;br&gt;Swift の Optional の値を unwrap する&lt;br&gt;Swift の Optional Binding - if let&lt;br&gt;Swift の Optional Binding - guard let&lt;br&gt;Swift の Optional Chaining&lt;br&gt;?? で Optional のデフォルト値を指定する&lt;br&gt;Swift の Optional とは？&lt;br&gt;Swift には Optional 型というものがあり、他のデータ型の値が存在するケースと、値が存在しない nil のケースを同じ変数で取り扱えるようになっています。&lt;br&gt;&lt;br&gt;Optinal という名前の値ありとなしの状態を保持するための enum で、元のデータ型を wrap したような形になっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;Optional の変数を定義したい時は、データ型の後ろに ? をつけるか、Optional&lt;データ型&gt; のようにデータ型を指定します。&lt;br&gt;&lt;br&gt;例えば、Optional の Int 型の定数を定義したい時は次のようにできます。&lt;br&gt;&lt;br&gt;let value1: Int? = 100&lt;br&gt;let value2: Optional&lt;Int&gt; = 100&lt;br&gt;&lt;br&gt;print(type(of: value1))&lt;br&gt;print(type(of: value2))&lt;br&gt;実行結果は次のようになります。 型を確認すると、Optionall の Int になっていることがわかります。&lt;br&gt;&lt;br&gt;Optionall&lt;Int&gt;&lt;br&gt;Optionall&lt;Int&gt;&lt;br&gt;&lt;br&gt;Swift の Optional の値を unwrap する&lt;br&gt;Swift の Optional の変数に入っている値を使う時には unwrap をする必要があります。&lt;br&gt;&lt;br&gt;値が存在していることが確実にわかっている場合は、変数の後ろに ! をつけることで、強制 unwrap することができます。&lt;br&gt;&lt;br&gt;nil の時はエラーになってしまうのでご注意ください。&lt;br&gt;&lt;br&gt;let value: Int? = 100&lt;br&gt;&lt;br&gt;if value != nil {&lt;br&gt;    print(&quot;Value = \(value!)&quot;)&lt;br&gt;} else {&lt;br&gt;    print(&quot;No value exists.&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Value = 100&lt;br&gt;&lt;br&gt;Swift の Optional Binding - if let&lt;br&gt;Swift の Optional Binding という方法で、Optional の変数に値が存在するかどうかを確認して、存在する時のみその値を定数や変数に代入して続きの処理を行うことができます。&lt;br&gt;&lt;br&gt;Optional Binding は if 文や while 文などの制御文で使えます。&lt;br&gt;&lt;br&gt;一番よく使われるのは if let で、先ほどのコードと同じようなことを Optional Binding を使ってやると、次のようになります。&lt;br&gt;&lt;br&gt;let value: Int? = 100&lt;br&gt;&lt;br&gt;if let i = value {&lt;br&gt;    print(&quot;Value = \(i)&quot;)&lt;br&gt;    print(type(of: value))&lt;br&gt;    print(type(of: i))&lt;br&gt;} else {&lt;br&gt;    print(&quot;No value exists.&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。 value に値が入っている時のみ、i に unwrap された値が入って、if 文のコードブロックが実行されます。&lt;br&gt;&lt;br&gt;value のデータ型が Optional&lt;Int&gt; なのに対して、i のデータ型が Int になっており、unwrap されているのがわかります。&lt;br&gt;&lt;br&gt;Value = 100&lt;br&gt;Optional&lt;Int&gt;&lt;br&gt;Int&lt;br&gt;if let で定義した定数 i は if のコードブロック内でしか使えません。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift の Optional Binding - guard let&lt;br&gt;もうひとつ、よく使われる Optional Binding に guard let があります。&lt;br&gt;&lt;br&gt;guard 文は常に else 文と一緒につかわれ、条件文が true の時だけ guard 文に続く処理をし、そうでない時は return や throw で guard 文のあるスコープを抜けなければなりません。&lt;br&gt;&lt;br&gt;Optional Binding の guard let を使うことによって、Optional の変数に値が存在する時のみ値を unwrap して続きの処理を行うことができます。&lt;br&gt;&lt;br&gt;if let では unwrap した定数は if のコードブロック内でしか使えませんでしたが、guard let で定義した定数は、その後でも利用できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、関数の中で次のような感じで使えます。&lt;br&gt;&lt;br&gt;func greet(name: String?) -&gt; String {&lt;br&gt;    &lt;br&gt;    guard let name = name else {&lt;br&gt;        return &quot;No name&quot;&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    return &quot;Hello, \(name)&quot;&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(greet(name: nil))&lt;br&gt;print(greet(name: &quot;Sakura&quot;))&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;No name&lt;br&gt;Hello, Sakura&lt;br&gt;この場合は guard の後で大したことはしていませんが、続きの処理をするのに値が確実に存在していなければならない、ということをはっきりさせたい時に使うとよいと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Optional Chaining&lt;br&gt;Optional の定数や変数があって、wrap したオブジェクトのプロパティやメソッドにエラーを出さずに安全にアクセスしたい時には Optional Chaining が使えます。&lt;br&gt;&lt;br&gt;Optional Chaining 演算子は ? で、Optional の定数や変数の後ろにつけてから、プロパティやメソッドを呼び出します。&lt;br&gt;&lt;br&gt;値が nil の時は続くプロパティやメソッドは実行されません。&lt;br&gt;&lt;br&gt;プロパティやメソッドを使う前に if 文などで、事前に Optional が nil かどうかチェックしなくて良いので便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、Optional の String があって、それに対して Optional Chaining を使って contains() メソッドを呼びたい時は次のようにできます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;let s:String? = &quot;abcde&quot;&lt;br&gt;&lt;br&gt;if s?.contains(&quot;c&quot;) == true {&lt;br&gt;    print(&quot;c exists.&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;c exists.&lt;br&gt;&lt;br&gt;?? で Optional のデフォルト値を指定する&lt;br&gt;Optional の値を使う時に ?? 演算子を使って、Optional の値が nil の時のデフォルト値を指定することができます。&lt;br&gt;&lt;br&gt;例えば、?? 演算子 を使って、Int() のコンストラクタで作った i という Int の Optional 定数が nil の時に &quot;Invalid input&quot; と出力するには、次のようにできます。&lt;br&gt;&lt;br&gt;let input = &quot;ABC&quot;&lt;br&gt;&lt;br&gt;let i = Int(input)&lt;br&gt;print(i ?? &quot;Invalid input&quot;)&lt;br&gt;実行結果は次のようになります。&quot;ABC&quot; が Int に変換できないため i が nil になるので Invalid input と出力されています。 input が整数の文字列の時にはその値が print されます。&lt;br&gt;&lt;br&gt;Invalid input&lt;br&gt;&lt;br&gt;以上、Swift の Optional についてご説明しました。</description><pubDate>Fri, 30 Oct 2020 08:12:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）の変換とフォーマット</title><link>https://softmoco.com/swift-basics/swift-string-convert.php</link><description>Swift の String（文字列）の変換とフォーマット&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の String（文字列）の変換とフォーマットの方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift で数値をフォーマットされた文字列に変換する&lt;br&gt;Swift で文字列を数値に変換する&lt;br&gt;Swift で日付をフォーマットされた文字列に変換する&lt;br&gt;Swift で文字列を日付に変換する&lt;br&gt;&lt;br&gt;Swift で数値をフォーマットされた文字列に変換する&lt;br&gt;Swift で Double などの数値のデータ型の値を、フォーマットされた文字列に変換するには String のコンストラクタが使えます。&lt;br&gt;&lt;br&gt;例えば、Double の数字を小数点第二位までなどの文字列にフォーマットしたいのであれば、次のようにできます。&lt;br&gt;&lt;br&gt;第二引数の arguments を変換するのに Foundation をインポートする必要があります。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let value1:Double = 1234.5678&lt;br&gt;print(String(format: &quot;%.0f&quot;, value1))&lt;br&gt;print(String(format: &quot;%.1f&quot;, value1))&lt;br&gt;print(String(format: &quot;%.2f&quot;, value1))&lt;br&gt;&lt;br&gt;let value2:Double = 10&lt;br&gt;print(String(format: &quot;%.0f&quot;, value2))&lt;br&gt;print(String(format: &quot;%.1f&quot;, value2))&lt;br&gt;print(String(format: &quot;%.2f&quot;, value2))&lt;br&gt;実行結果は次のようになります。値は四捨五入されます。&lt;br&gt;&lt;br&gt;1235&lt;br&gt;1234.6&lt;br&gt;1234.57&lt;br&gt;10&lt;br&gt;10.0&lt;br&gt;10.00&lt;br&gt;&lt;br&gt;Swift で文字列を数値に変換する&lt;br&gt;Swift で数字の文字列を数値に変換するには、数値型のコンストラクタが使えます。&lt;br&gt;&lt;br&gt;例えば、Double に変換したいのであれば、次のようにできます。&lt;br&gt;&lt;br&gt;戻り値は Optional になり、変換に失敗すると nil が返ります。&lt;br&gt;&lt;br&gt;let s1 = &quot;12345.678&quot;&lt;br&gt;let d1 = Double(s1)&lt;br&gt;print(d1 ?? &quot;Invalid Input&quot;)&lt;br&gt;&lt;br&gt;let s2 = &quot;ABC&quot;&lt;br&gt;let d2 = Double(s2)&lt;br&gt;print(d2 ?? &quot;Invalid Input&quot;)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;12345.678&lt;br&gt;Invalid Input&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift で日付をフォーマットされた文字列に変換する&lt;br&gt;Swift で日付を、フォーマットされた文字列に変換するには DateFormatter が使えます。&lt;br&gt;&lt;br&gt;詳しくはこちらの「Swift で日付(Date)をフォーマットされた文字列(String)に変換する」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で文字列を日付に変換する&lt;br&gt;Swift で文字列 (String) を日付 (Date) に変換するにも、DateFormatter が使えます。&lt;br&gt;&lt;br&gt;DateFormatter を使うので、Foundation をインポートする必要があります。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let dateString = &quot;2021-10-22 22:34:54&quot;&lt;br&gt;&lt;br&gt;let df = DateFormatter()&lt;br&gt;df.dateFormat = &quot;yyyy-MM-dd HH:mm:ss&quot;&lt;br&gt;&lt;br&gt;if let date = df.date(from: dateString) {&lt;br&gt;    print(date)&lt;br&gt;    print(type(of: date))&lt;br&gt;    print(df.string(from: date))&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;2021-10-23 05:34:54 +0000&lt;br&gt;Date&lt;br&gt;2021-10-22 22:34:54&lt;br&gt; 5 行目で DateFormatter を生成して、6 行目で変換する文字列に合った dateFormat を設定しています。&lt;br&gt;&lt;br&gt;8 行目が DateFormatter の date メソッドを使って、文字列から Date に変換しています。 変換に失敗すると nil が返ります。&lt;br&gt;&lt;br&gt;実行結果の 1 行目は Date をそのまま出力したので UTC の時間になっています。 アメリカのロサンゼルスに住んでいるので +7 時間になり、タイムゾーンが +0000 になっています。ロケールの調整が必要な方は、DateFormatter に設定可能です。&lt;br&gt;&lt;br&gt;実行結果の 2 行目で date 変数が Date 型なっていることが確認できます。 3 行目は date を同じ DateFormatter を使ってまた文字列に戻して出力しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の String（文字列）の変換とフォーマットの方法についてご説明しました。</description><pubDate>Fri, 23 Oct 2020 19:23:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）の切り出し - Substring</title><link>https://softmoco.com/swift-basics/swift-string-substring.php</link><description>Swift の String（文字列）の切り出し - Substring&lt;br&gt;&lt;br&gt; &lt;br&gt;String クラスに文字を切り出す時に使える Substring という名前のメソッドがあるプログラミング言語がありますが、Swift には Substring というデータ型はありますが、Substring というメソッドはありません。&lt;br&gt;&lt;br&gt;ここでは Swift の String（文字列）から文字を切り出す方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift で文字列の前から指定した文字数を切り出す&lt;br&gt;Swift で文字列の後ろから指定した文字数を切り出す&lt;br&gt;Swift で文字列から指定した位置の文字を切り出す&lt;br&gt;Swift で文字の開始位置を指定して切り出す&lt;br&gt;Swift で文字の開始と終了の位置を指定して切り出す&lt;br&gt;Swift で文字列の前から指定した文字数を切り出す&lt;br&gt;Swift で文字列の前から指定した文字数を切り出したい時には、prefix() メソッドが使えます。&lt;br&gt;&lt;br&gt;引数に文字数を渡すと、前からその文字数分の Substring　が返ります。&lt;br&gt;&lt;br&gt;引数に指定した文字数が元の文字列の文字数より多い時もエラーにはならず、その時は元の文字列全部が返ります。&lt;br&gt;&lt;br&gt;引数にマイナスの値を指定するとエラーになります。&lt;br&gt;&lt;br&gt;戻り値の Substring は元の文字列をポイントしたものなので、そこから新しい文字列を生成したい時は String のコンストラクタに Substring を渡して String を生成します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、prefix() メソッドを使って、文字列の前から 5 文字を切り出してみます。&lt;br&gt;&lt;br&gt;let s1 = &quot;ABCDEFGHIJKLMN&quot;&lt;br&gt;let sub1 = String(s1.prefix(5))&lt;br&gt;print(sub1)&lt;br&gt;&lt;br&gt;let s2 = &quot;ABC&quot;&lt;br&gt;let sub2 = String(s2.prefix(5))&lt;br&gt;print(sub2)&lt;br&gt;実行結果は次のようになり、前から 5 文字ある時は 5 文字、ない時は最後の文字までが切り出されています。&lt;br&gt;&lt;br&gt;ABCDE&lt;br&gt;ABC&lt;br&gt;&lt;br&gt;Swift で文字列の後ろから指定した文字数を切り出す&lt;br&gt;Swift で文字列の前から指定した文字数を切り出したい時には、suffix() メソッドが使えます。&lt;br&gt;&lt;br&gt;前後が違うだけで、prefix() メソッドと同じように使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;suffix() メソッドを使って、文字列の後ろから 5 文字を切り出してみます。&lt;br&gt;&lt;br&gt;let s1 = &quot;ABCDEFGHIJKLMN&quot;&lt;br&gt;let sub1 = String(s1.suffix(5))&lt;br&gt;print(sub1)&lt;br&gt;&lt;br&gt;let s2 = &quot;ABC&quot;&lt;br&gt;let sub2 = String(s2.suffix(5))&lt;br&gt;print(sub2)&lt;br&gt;実行結果は次のようになり、後ろから 5 文字切り出されています。&lt;br&gt;&lt;br&gt;JKLMN&lt;br&gt;ABC&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift で文字列から指定した位置の文字を切り出す&lt;br&gt;他のプログラミング言語の Substring メソッドでは、開始のインデックスを指定して、それ以降の文字を切り出したりできますね。&lt;br&gt;&lt;br&gt;また、開始・終了のインデックスや、開始のインデックスと長さを指定して文字列を切り出したりできると思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift には同じような Substring メソッドがありません。&lt;br&gt;&lt;br&gt;文字を切り出すには、いろんな方法があるかと思いますが、ここでは、開始のインデックスなどを指定して文字を切り出す時に使えるサンプルコードをご紹介します。&lt;br&gt;&lt;br&gt;Swift で文字の開始位置を指定して切り出す&lt;br&gt;まずは、Swift で文字の開始位置を指定して切り出すサンプルコードです。&lt;br&gt;&lt;br&gt;例えば、開始のインデックスを 3 に指定して文字列を切り出すには次のようにできます。&lt;br&gt;&lt;br&gt;let s = &quot;ABCDEFGHIJKLMN&quot;&lt;br&gt;let start = 3&lt;br&gt;&lt;br&gt;let startIdx = s.index(s.startIndex, offsetBy: start, limitedBy: s.endIndex) ?? s.endIndex&lt;br&gt;let sub = String(s[startIdx...])&lt;br&gt;&lt;br&gt;print(&quot;sub = \(sub)&quot;)&lt;br&gt;4 行目で index() メソッドを使って、開始インデックスのポジションを示す String.Index を取得しています。&lt;br&gt;&lt;br&gt;limitedBy はオプショナルの引数ですが、limitedBy を指定しないと、実在する index を超えた値を指定するとエラーになります。&lt;br&gt;&lt;br&gt;limitedBy を指定すると、そのインデックス超えて検索しないので、実在する index を超えた値を指定してもエラーになりません。&lt;br&gt;&lt;br&gt;その時は null が返るので、endIndex プロパティの値（最後のインデックス + 1 の位置の String.Index）が startIdx に入るようにしておきます。&lt;br&gt;&lt;br&gt;そして、5 行目の s[startIdx...] で取得した startIdx から残り全部の文字の Substring を取得し、それを String のコンストラクタに渡して新しい String を生成しています。&lt;br&gt;&lt;br&gt;このコードも prefix() のように start にマイナスの値を指定するとエラーになるのでご注意ください。limitedBy も指定せずに、最初に start が実在する index の範囲の値かチェックして希望の動きになるように処理してしまっても良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;実行結果は次のようになり、sub にインデックスが 3 の D 以降の文字列が取得できています。&lt;br&gt;&lt;br&gt;sub = DEFGHIJKLMN&lt;br&gt;&lt;br&gt;Swift で文字の開始と終了の位置を指定して切り出す&lt;br&gt;続いて、文字の開始と終了の位置を指定して、文字列を切り出すサンプルコードです。&lt;br&gt;&lt;br&gt;例えば、開始と終了のインデックスを 3 と 6 に指定して文字列を切り出すには次のようにできます。&lt;br&gt;&lt;br&gt;let s = &quot;ABCDEFGHIJKLMN&quot;&lt;br&gt;let start = 3&lt;br&gt;let end = 6&lt;br&gt;&lt;br&gt;var sub = &quot;&quot;&lt;br&gt;&lt;br&gt;if start &gt; end {&lt;br&gt;    sub = &quot;&quot;&lt;br&gt;} else {&lt;br&gt;    let startIdx = s.index(s.startIndex, offsetBy: start, limitedBy: s.endIndex) ?? s.endIndex&lt;br&gt;    let endIdx = s.index(s.startIndex, offsetBy: end + 1, limitedBy: s.endIndex) ?? s.endIndex&lt;br&gt;    sub = String(s[startIdx..&lt;endIdx])&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(&quot;sub = \(sub)&quot;)&lt;br&gt;開始のインデックスの String.Index を取得したのと同じように、終了のインデックスの String.Index も取得し Substring を取得して String に変換しています。&lt;br&gt;&lt;br&gt;こちらも start がマイナスの時はエラーになりますので、必要であれば先にチェックして 0 に置き換えるなり処理してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;実行結果は次のようになり、sub にインデックスが 3 ~ 6 の DEFG が取得できています。&lt;br&gt;&lt;br&gt;sub = DEFG&lt;br&gt;Swift の String（文字列）の切り出し - Substring 1&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の String（文字列）から文字を切り出す方法についてご説明しました。&lt;br&gt;</description><pubDate>Fri, 23 Oct 2020 19:22:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）- エスケープとトリム</title><link>https://softmoco.com/swift-basics/swift-string-escape-trim.php</link><description>Swift の String（文字列）- エスケープとトリム&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の String（文字列）でエスケープとトリムをする方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の String（文字列）で文字をエスケープする&lt;br&gt;Swift の String（文字列）に改行やタブを挿入する&lt;br&gt;Swift の String（文字列）をトリムする&lt;br&gt;Swift の String（文字列）で文字をエスケープする&lt;br&gt;Swift の String（文字列）を定義する時はダブルクォート(&quot;)で囲みます。&lt;br&gt;&lt;br&gt;文字列リテラルの中でダブルクォートを使いたい時には、それらの文字をエスケープする必要があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift ではそのような文字をエスケープするのにバックスラッシュ \ を使います。&lt;br&gt;&lt;br&gt;ダブルクォートを文字の中に入れたい場合は、ダブルクォートの前にバックスラッシュをつけて \&quot; のようにエスケープします。&lt;br&gt;&lt;br&gt;また、エスケープ文字として使われているバックスラッシュを文字列に入れたい時には \\ のようにします。&lt;br&gt;&lt;br&gt;let s1 = &quot;ダブルクォート \&quot; です。&quot;&lt;br&gt;let s2 = &quot;バックスラッシュ \\ です。&quot;&lt;br&gt;&lt;br&gt;print(s1)&lt;br&gt;print(s2)&lt;br&gt;実行結果は次のようになります。エスケープ文字は消えて、出力された文字列に、それぞれダブルクォート・バックスラッシュが表示されていますね。&lt;br&gt;&lt;br&gt;ダブルクォート &quot; です。&lt;br&gt;バックスラッシュ \ です。&lt;br&gt;&lt;br&gt;Swift の String（文字列）に改行やタブを挿入する&lt;br&gt;Swift の String（文字列）にタブや改行を挿入したいことがあるかもしれません。&lt;br&gt;&lt;br&gt;文字列の中にタブ文字の \t を入れるとその場所にタブが挿入されます。&lt;br&gt;&lt;br&gt;文字列の中に改行文字の \n もしくは \r もしくは \r\n を入れると、その場所に改行が挿入されます。&lt;br&gt;&lt;br&gt; 改行コードシステムによって違います。Unix や Mac OS X 以降では \n、Windows では \r\n、Mac OS 9 以前は \r が使われています。&lt;br&gt;&lt;br&gt;&lt;br&gt;文字列に \t と \r\n を入れて print してみましょう。&lt;br&gt;&lt;br&gt;print(&quot;aaa\tbbb\tccc&quot;)&lt;br&gt;print(&quot;-------------------&quot;)&lt;br&gt;print(&quot;xxx\r\nyyy\r\nzzz&quot;)&lt;br&gt;実行結果は次のようになります。タブは  playground では少しわかりにくいですが、TextEdit などに貼り付けると、タブと改行が挿入されているのがわかると思います。&lt;br&gt;&lt;br&gt;aaa	bbb	ccc&lt;br&gt;-------------------&lt;br&gt;xxx&lt;br&gt;yyy&lt;br&gt;zzz&lt;br&gt;Swift の String（文字列）- エスケープとトリム 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の String（文字列）をトリムする&lt;br&gt;プログラミングで、文字列の先頭や末尾に含まれる空白文字などを削除する関数名が trim であることが多く、その操作を「トリムする」と言います。&lt;br&gt;&lt;br&gt;Swift の String（文字列）をトリムをしたい時は trimmingCharacters() というメソッドが使えます。&lt;br&gt;&lt;br&gt;trimmingCharacters() メソッドは引数に .whitespaces や .whitespacesAndNewlines などの CharacterSet を受け取り、それをトリムした文字列を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、trimmingCharacters() メソッドを使って文字列をトリムしてみましょう。&lt;br&gt;&lt;br&gt;trimmingCharacters() メソッドは　NSString のメソッドなので Foundation をインポートする必要があります。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let s = &quot;   Test  &quot;&lt;br&gt;let trimmed = s.trimmingCharacters(in: .whitespaces)&lt;br&gt;&lt;br&gt;print(&quot;[\(s)]&quot;)&lt;br&gt;print(&quot;[\(trimmed)]&quot;)&lt;br&gt;実行結果は次のようになります。前後に [ ] を表示していますが、空白が削除されているのがわかります。&lt;br&gt;&lt;br&gt;[   Test  ]&lt;br&gt;[Test]&lt;br&gt;&lt;br&gt;以上、Swift の文字列でエスケープとトリムをする方法についてご説明しました。&lt;br&gt;</description><pubDate>Fri, 23 Oct 2020 19:21:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）の置換と検索</title><link>https://softmoco.com/swift-basics/swift-string-replace-find.php</link><description>Swift の String（文字列）の置換と検索&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift 文字列の置換と検索をする方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の String（文字列）を置換する&lt;br&gt;Swift の String（文字列）を検索する&lt;br&gt;Swift の String（文字列）を置換する&lt;br&gt;Swift で String（文字列）の中の文字を置換するには、NSString の replacingOccurrences() メソッドが使えます。&lt;br&gt;&lt;br&gt;replacingOccurrences() メソッドの構文は次の通りです。&lt;br&gt;&lt;br&gt;replacingOccurrences(of: &quot;置換元の文字列&quot;, with: &quot;置換後の文字列&quot;)&lt;br&gt;&lt;br&gt;文字列の中の &quot;置換元の文字列&quot; を &quot;置換後の文字列&quot; に置換した新しい文字列を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、replacingOccurrences() メソッドを使って、文字列を置換してみましょう。&lt;br&gt;&lt;br&gt;NSString のメソッドを使うので、Foundation のインポートが必要になります。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;var s = &quot;What&#039;s your favorite color?&quot;&lt;br&gt;&lt;br&gt;print(s.replacingOccurrences(of: &quot;color&quot;, with: &quot;food&quot;))&lt;br&gt;print(s.replacingOccurrences(of: &quot;r&quot;, with: &quot;R&quot;))&lt;br&gt;実行結果は次のようになります。 それぞれ元の文字列の、置換元に指定した文字列が、置換後の文字列に置換されていますね。&lt;br&gt;&lt;br&gt;What&#039;s your favorite food?&lt;br&gt;What&#039;s youR favoRite coloR?&lt;br&gt;Swift の String（文字列）の置換と検索 1&lt;br&gt;&lt;br&gt;replacingOccurrences() メソッドを使って、空の文字列 &quot;&quot; に置換することで、指定した文字を削除したりするのにも使えますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の String（文字列）を検索する&lt;br&gt;文字列の中に指定した文字列含まれているかどうかを検索したい時は contains() メソッドが使えます。&lt;br&gt;&lt;br&gt;検索元の文字列.contains(&quot;検索したい文字列&quot;) のように指定し、「検索元の文字列」に「検索したい文字列」が含まれている時は true、含まれていなければ false を返します。&lt;br&gt;&lt;br&gt;contains() は String のメソッドですが、引数を String 型から Character 型に変換するのに Foundation をインポートする必要があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、contains() メソッドを使って、次のような文字列 s に &quot;color&quot; と &quot;food&quot; という文字が含まれているか確認してみます。&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;var s = &quot;What&#039;s your favorite color?&quot;&lt;br&gt;&lt;br&gt;print(s.contains(&quot;color&quot;))&lt;br&gt;print(s.contains(&quot;food&quot;))&lt;br&gt;実行結果は次のようになります。color は存在しているので true が、food は存在していないので false が print されています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;以上、Swift 文字列の置換と検索をする方法についてご説明しました。&lt;br&gt;</description><pubDate>Fri, 23 Oct 2020 19:20:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）の結合と分割</title><link>https://softmoco.com/swift-basics/swift-string-concatenate-split.php</link><description>Swift の String（文字列）の結合と分割&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の String（文字列）の結合と分割する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の String（文字列）を結合する&lt;br&gt;Swift の String（文字列）を分割する&lt;br&gt;Swift の String（文字列）を分割して String の配列を取得する&lt;br&gt;Swift の String（文字列）を結合する&lt;br&gt;Swift の String（文字列）を結合したい時は + 演算子や、 += 演算子、String Interpolation（文字列補間）などが使えます。&lt;br&gt;&lt;br&gt;この三つの方法で、以下のような greet と name という文字列を結合してみます。&lt;br&gt;&lt;br&gt;var greet = &quot;Hello&quot;&lt;br&gt;let name = &quot;Yuka&quot;&lt;br&gt;&lt;br&gt;let string1 = greet + &quot;, &quot; + name + &quot;!&quot;&lt;br&gt;let string2 = &quot;\(greet), \(name)!&quot;&lt;br&gt;&lt;br&gt;greet += &quot;, &quot;&lt;br&gt;greet += name&lt;br&gt;greet += &quot;!&quot;&lt;br&gt;let string3 = greet&lt;br&gt;&lt;br&gt;print(string1)&lt;br&gt;print(string2)&lt;br&gt;print(string3)&lt;br&gt;実行結果は次のようになります。 string1、string2、string3 の値は同じで、それぞれ文字列が結合されています。&lt;br&gt;&lt;br&gt;Hello, Yuka!&lt;br&gt;Hello, Yuka!&lt;br&gt;Hello, Yuka!&lt;br&gt;このようなケースでは、String Interpolation（文字列補間）で結合するのが一番感覚的にわかりやすく簡単ですね。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の String（文字列）を分割する&lt;br&gt;Swift の String（文字列）を分割したい時には、split() メソッドが使えます。&lt;br&gt;&lt;br&gt;split() メソッドには、separator、maxSplits、omittingEmptySubsequences という引数が指定でき、戻り値として分割された、元の文字列をポイントする Substring 型の配列を返します。&lt;br&gt;&lt;br&gt;separator のみ必須で、何の文字で分割するかを指定します。&lt;br&gt;&lt;br&gt;maxSplits は何回分割するかで、デフォルトは Int の最大値になっています。&lt;br&gt;&lt;br&gt;omittingEmptySubsequences は分割した後で、空文字列を戻り値の要素からはぶくかどうかで、デフォルトは True です。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、split() を使って文字列を分割してみましょう。&lt;br&gt;&lt;br&gt;let message = &quot;My name is Yuka.  &quot;&lt;br&gt;&lt;br&gt;print(message.split(separator: &quot; &quot;))&lt;br&gt;print(message.split(separator: &quot; &quot;, maxSplits: 1))&lt;br&gt;実行結果は次のようになり、message 文字列が、空白で分割されています。&lt;br&gt;&lt;br&gt;maxSplits を 1 に指定したほうは、一回だけ分割されています。&lt;br&gt;&lt;br&gt;[&quot;My&quot;, &quot;name&quot;, &quot;is&quot;, &quot;Yuka.&quot;]&lt;br&gt;[&quot;My&quot;, &quot;name is Yuka.  &quot;]&lt;br&gt;&lt;br&gt;Swift の String（文字列）を分割して String の配列を取得する&lt;br&gt;Swift の文字列の split() メソッドは Substring 型の配列を返し、Substring は元の文字列をポイントしたスライスでした。&lt;br&gt;&lt;br&gt;分割された String の配列を取得したい時は、NSString の components() メソッドを使って取得することができます。&lt;br&gt;&lt;br&gt;components() メソッドの引数は、separatedBy のみなので、分割の結果、空文字列の要素があれば、それも配列に含まれます。&lt;br&gt;&lt;br&gt;また、 NSString のメソッドを使うので、Foundation のインポートが必要になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;import Foundation&lt;br&gt;&lt;br&gt;let message = &quot;My name is Yuka.  &quot;&lt;br&gt;&lt;br&gt;let splitResult1 = message.split(separator: &quot; &quot;)&lt;br&gt;let splitResult2 = message.components(separatedBy: &quot; &quot;)&lt;br&gt;&lt;br&gt;print(splitResult1)&lt;br&gt;print(type(of: splitResult1))&lt;br&gt;print(splitResult2)&lt;br&gt;print(type(of: splitResult2))&lt;br&gt;実行結果は次のようになります。 components() メソッドで分割したほうは、String の Array になっていますね。&lt;br&gt;&lt;br&gt;[&quot;My&quot;, &quot;name&quot;, &quot;is&quot;, &quot;Yuka.&quot;]&lt;br&gt;Array&lt;Substring&gt;&lt;br&gt;[&quot;My&quot;, &quot;name&quot;, &quot;is&quot;, &quot;Yuka.&quot;, &quot;&quot;, &quot;&quot;]&lt;br&gt;Array&lt;String&gt;&lt;br&gt;&lt;br&gt;以上、Swift の String（文字列）の結合と分割する方法についてご説明しました。</description><pubDate>Fri, 23 Oct 2020 19:19:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）の基本と String Interpolation</title><link>https://softmoco.com/swift-basics/swift-string-declare-interpolation.php</link><description>Swift の String（文字列）の基本と String Interpolation&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の String（文字列）の基本的なことと String Interpolation（文字列補間）についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の String（文字列）を生成する&lt;br&gt;Swift の String（文字列）が空っぽかどうかを確認する&lt;br&gt;Swift の String（文字列）の文字数を取得する&lt;br&gt;Swift の String Interpolation（文字列補間）&lt;br&gt;Swift の String（文字列）を生成する&lt;br&gt;Swift では、次のようにダブルクォート(&quot;)で囲まれた文字を文字列とみなします。&lt;br&gt;&lt;br&gt;String 型の変数や定数を作りたい時は次のようにできます。&lt;br&gt;&lt;br&gt;var s1 = &quot;String 型の変数&quot;&lt;br&gt;let s2 = &quot;String 型の定数&quot;&lt;br&gt;&lt;br&gt;上の方法は 1 行で文字列を定義する時に使う方法で、文字列を複数行で定義したい時は 3 つのダブルクォートの行で文字を囲みます。&lt;br&gt;&lt;br&gt;let s = &quot;&quot;&quot;&lt;br&gt;こうすると、&lt;br&gt;複数行で文字列を&lt;br&gt;定義することができます。&lt;br&gt;&quot;&quot;&quot;&lt;br&gt;print(s)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;こうすると、&lt;br&gt;複数行で文字列を&lt;br&gt;定義することができます。&lt;br&gt;&lt;br&gt;Swift の String（文字列）が空っぽかどうかを確認する&lt;br&gt;Swift の String（文字列）が空っぽかどうかを確認するには、String の isEmpty プロパティが使えます。&lt;br&gt;&lt;br&gt;var s = &quot;&quot;&lt;br&gt;print(s.isEmpty)&lt;br&gt;&lt;br&gt;s = &quot;Test&quot;&lt;br&gt;print(s.isEmpty)&lt;br&gt;実行結果は次のようになり、文字列が空の時は isEmpty プロパティが true を返しています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;Swift の String（文字列）の文字数を取得する&lt;br&gt;Swift の String（文字列）の文字数を取得するには、String の count プロパティが使えます。&lt;br&gt;&lt;br&gt;var s = &quot;&quot;&lt;br&gt;print(s.count)&lt;br&gt;&lt;br&gt;s = &quot;Test&quot;&lt;br&gt;print(s.count)&lt;br&gt;&lt;br&gt;s = &quot;</description><pubDate>Fri, 23 Oct 2020 19:17:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の String（文字列）</title><link>https://softmoco.com/swift-basics/swift-string.php</link><description>Swift の String（文字列）&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の String（文字列）についてご説明します。&lt;br&gt;&lt;br&gt;Swift の文字列にはたくさんの組み込みのメソッドなどが用意されています。&lt;br&gt;&lt;br&gt;文字列の扱い方について詳しく学んでいきましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の String（文字列）の基本と String Interpolation&lt;br&gt;Swift の String（文字列）を生成する&lt;br&gt;Swift の String（文字列）が空っぽかどうかを確認する&lt;br&gt;Swift の String（文字列）の文字数を取得する&lt;br&gt;Swift の String Interpolation（文字列補間）&lt;br&gt;Swift の String（文字列）の結合と分割&lt;br&gt;Swift の String（文字列）を結合する&lt;br&gt;Swift の String（文字列）を分割する&lt;br&gt;Swift の String（文字列）を分割して String の配列を取得する&lt;br&gt;Swift の String（文字列）の置換と検索&lt;br&gt;Swift の String（文字列）を置換する&lt;br&gt;Swift の String（文字列）を検索する&lt;br&gt;Swift の String（文字列）- エスケープとトリム&lt;br&gt;Swift の String（文字列）で文字をエスケープする&lt;br&gt;Swift の String（文字列）に改行やタブを挿入する&lt;br&gt;Swift の String（文字列）をトリムする&lt;br&gt;Swift の String（文字列）の切り出し - Substring&lt;br&gt;Swift で文字列の前から指定した文字数を切り出す&lt;br&gt;Swift で文字列の後ろから指定した文字数を切り出す&lt;br&gt;Swift で文字列から指定した位置の文字を切り出す&lt;br&gt;Swift の String（文字列）の変換とフォーマット&lt;br&gt;Swift で数値をフォーマットされた文字列に変換する&lt;br&gt;Swift で文字列を数値に変換する&lt;br&gt;Swift で日付をフォーマットされた文字列に変換する&lt;br&gt;Swift で文字列を日付に変換する</description><pubDate>Fri, 23 Oct 2020 19:15:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Tuple（タプル）</title><link>https://softmoco.com/swift-basics/swift-tuple.php</link><description>Swift の Tuple（タプル）&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift のタプル (tuple) についてご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Tuple（タプル）の基本&lt;br&gt;Swift の Tuple（タプル）の要素にアクセスする&lt;br&gt;Swift の Tuple（タプル）の要素を変更する&lt;br&gt;Swift の Tuple（タプル）の基本&lt;br&gt;Swift のタプル (tuple) は、() で囲まれてカンマで区切られた複数の値のグループで、それをひとつの値として扱えます。&lt;br&gt;&lt;br&gt;タプル (tuple) の要素のデータ型はそろっていなくても大丈夫です。&lt;br&gt;&lt;br&gt;var tuple1 = (5.0, &quot;Test&quot;, 2, &quot;ABC&quot;)&lt;br&gt;&lt;br&gt;次のように、各要素に名前をつけることもできます。&lt;br&gt;&lt;br&gt;var expDate = (month: &quot;February&quot;, year: 2025)&lt;br&gt;タプルは Array と違って、要素を追加したり削除したりすることはできません。また、要素のデータ型を変更することもできません。&lt;br&gt;&lt;br&gt;構造体やクラスなどを作らずに、複数の値を関数から返したい時などに便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Tuple（タプル）の要素にアクセスする&lt;br&gt;Swift のタプル (tuple) の要素にアクセスしたい時は、インデックスか名前でアクセスできます。&lt;br&gt;&lt;br&gt;インデックスは 0 から始まり、tuple.index のように指定します。&lt;br&gt;&lt;br&gt;var expDate = (month: &quot;February&quot;, year: 2025)&lt;br&gt;&lt;br&gt;print(expDate.0) // month&lt;br&gt;print(expDate.year)&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;February&lt;br&gt;2025&lt;br&gt;存在しないインデックスや名前を指定するとエラーになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Tuple（タプル）の要素を変更する&lt;br&gt;Swift のタプル (tuple) のの要素は、同じデータ型のタプルを代入することによって変更可能です。&lt;br&gt;&lt;br&gt;代入する新しいタプルに一部の要素だけを指定することはできません。&lt;br&gt;&lt;br&gt;要素のデータ型と順番が合っていれば、要素の名前は指定しなくても大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、expDate タプルの値を変更してみます。&lt;br&gt;&lt;br&gt;var expDate = (month: &quot;February&quot;, year: 2025)&lt;br&gt;print(expDate)&lt;br&gt;&lt;br&gt;expDate = (month: &quot;May&quot;, year: 2026)&lt;br&gt;print(expDate)&lt;br&gt;&lt;br&gt;expDate = (&quot;July&quot;, 2027)&lt;br&gt;print(expDate)&lt;br&gt;実行結果は次のようになり、タプルの値が変更されています。&lt;br&gt;&lt;br&gt;(month: &quot;February&quot;, year: 2025)&lt;br&gt;(month: &quot;May&quot;, year: 2026)&lt;br&gt;(month: &quot;July&quot;, year: 2027)&lt;br&gt;&lt;br&gt;以上、Swift のタプルについてご説明しました。</description><pubDate>Fri, 16 Oct 2020 23:09:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Dictionary（辞書）- ループ・mapValue・filter</title><link>https://softmoco.com/swift-basics/swift-dictionary-loop-map-filter.php</link><description>Swift の Dictionary（辞書）- ループ・mapValue・filter&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Dictionary（辞書）のループ方法と、mapValue・filter メソッドの使い方についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Dictionary（辞書）のキーと値をループする&lt;br&gt;Swift の Dictionary（辞書）のキーのみ、値のみをループする&lt;br&gt;mapValue() で値を変換した Dictionary を生成する&lt;br&gt;filter() でフィルターしたキーと値を持つ Dictionary を生成する&lt;br&gt;Swift の Dictionary（辞書）のキーと値をループする&lt;br&gt;Swift の Dictionary（辞書）のキーと値をループするには、何通りか方法があります。&lt;br&gt;&lt;br&gt;まずは for-in ループを使う方法です。&lt;br&gt;&lt;br&gt;for に続いて指定した変数に現在のキーと値のペアが入り、キーは .key、値は .value で取得できます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;for d in dict {&lt;br&gt;    print(&quot;\(d.key): \(d.value)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。 Swift の Dictionary（辞書）は順番を保たないので、生成時に指定した順番とは違いますが、全てのキーと値のペアが print されています。&lt;br&gt;&lt;br&gt;Key3: 66&lt;br&gt;Key4: 72&lt;br&gt;Key1: 100&lt;br&gt;Key2: 30&lt;br&gt;&lt;br&gt;次のようにして、キーと値をタプルに分割代入してしまうこともできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;for (key, value) in dict {&lt;br&gt;    print(&quot;\(key): \(value)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Key4: 72&lt;br&gt;Key3: 66&lt;br&gt;Key2: 30&lt;br&gt;Key1: 100&lt;br&gt;&lt;br&gt;forEach() メソッドを使っても同じように、辞書のキーと値を print することもできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;dict.forEach { d in&lt;br&gt;    print(&quot;\(d.key): \(d.value)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、全てのキーと値が print されています。&lt;br&gt;&lt;br&gt;Key4: 72&lt;br&gt;Key1: 100&lt;br&gt;Key2: 30&lt;br&gt;Key3: 66&lt;br&gt;for-in ループとの違いは forEach() では break や continue が使えないことなどがあげられます。&lt;br&gt;&lt;br&gt;ループ処理の途中で何かの条件で break、continue、return したいような時は for-in ループを使ってください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Dictionary（辞書）のキーのみ、値のみをループする&lt;br&gt;Swift の Dictionary（辞書）のキーのみ、値のみをループするには、keys プロパティと values プロパティをループします。&lt;br&gt;&lt;br&gt;Dictionary のキーと値のペアのキーのみをループしたい時は次のようにできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;for key in dict.keys {&lt;br&gt;    print(key)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Key2&lt;br&gt;Key3&lt;br&gt;Key4&lt;br&gt;Key1&lt;br&gt;&lt;br&gt;Dictionary のキーと値のペアの値のみをループしたい時は次のようにできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;for value in dict.values {&lt;br&gt;    print(value)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;66&lt;br&gt;72&lt;br&gt;30&lt;br&gt;100&lt;br&gt;&lt;br&gt;Dictionary のキー順でループして、値も取得したい時は、keys の sorted() メソッドを使って、次のようにすることができます。&lt;br&gt;&lt;br&gt;ここでは、値があることがわかっているので、dict[key] で得られるオプショナルの値を ! で強制アンラップしていますが、nil になる可能性がある場合はお気をつけください。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;for key in dict.keys.sorted() {&lt;br&gt;    print(&quot;\(key): \(dict[key]!)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、Key の順番で出力されています。&lt;br&gt;&lt;br&gt;Key1: 100&lt;br&gt;Key2: 30&lt;br&gt;Key3: 66&lt;br&gt;Key4: 72&lt;br&gt;&lt;br&gt; &lt;br&gt;mapValue() で値を変換した Dictionary を生成する&lt;br&gt;Swift の Dictionary（辞書）の mapValue() メソッドを使って、値を変換した辞書を生成することができます。&lt;br&gt;&lt;br&gt;例えば、値を全部 10 倍に変換した辞書を生成したい時は次のようにできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;let dict2 = dict.mapValues { value in&lt;br&gt;    return value * 10&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(dict)&lt;br&gt;print(dict2)&lt;br&gt;実行結果は次のようになり、dict2 の値が全て 10 倍されています。&lt;br&gt;&lt;br&gt;[&quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72, &quot;Key1&quot;: 100]&lt;br&gt;[&quot;Key2&quot;: 300, &quot;Key3&quot;: 660, &quot;Key4&quot;: 720, &quot;Key1&quot;: 1000]&lt;br&gt;&lt;br&gt;filter() でフィルターしたキーと値を持つ Dictionary を生成する&lt;br&gt;Swift の filter() メソッドを使って、指定した条件を満たすキーと値のペアだけを含んだ辞書を生成することができます。&lt;br&gt;&lt;br&gt;例えば、次のような dict 辞書の中で、値が 70 以上のキーと値のペアのみを含む辞書を生成したい場合は次のようにできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 100, &quot;Key2&quot;: 30, &quot;Key3&quot;: 66, &quot;Key4&quot;: 72]&lt;br&gt;&lt;br&gt;let dict2 = dict.filter { key, value in&lt;br&gt;    return value &gt;= 70&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(dict2)&lt;br&gt;実行結果は次のようになり、dict2 には値が 70 以上のキーと値のペアのみが含まれていますね。&lt;br&gt;&lt;br&gt;[&quot;Key1&quot;: 100, &quot;Key4&quot;: 72]&lt;br&gt;Swift の Dictionary（辞書）- ループ・map・filter 1&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Dictionary（辞書）のループ方法と、mapValue・filter メソッドの使い方についてご説明しました。</description><pubDate>Fri, 16 Oct 2020 23:08:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Dictionary（辞書）- キーと値のペア数とキーの存在確認</title><link>https://softmoco.com/swift-basics/swift-dictionary-inspect.php</link><description>Swift の Dictionary（辞書）- キーと値のペア数とキーの存在確認&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Dictionary（辞書）のキーと値のペアの数とキーの存在を確認する方法などについてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;count プロパティで Dictionary のキーと値のペアの数を取得する&lt;br&gt;isEmpty プロパティで Dictionary が空かどうか確認する&lt;br&gt;Dictionary に指定したキーが存在するか確認する&lt;br&gt;count プロパティで Dictionary のキーと値のペアの数を取得する&lt;br&gt;Swift の Dictionary（辞書）の中のキーと値のペアの数を取得したい時には Dictionary の count プロパティを使います。&lt;br&gt;&lt;br&gt;var dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;print(dict.count)&lt;br&gt;実行結果は次のようになり、キーと値のペアは三つなので 3 と出力されています。&lt;br&gt;&lt;br&gt;3&lt;br&gt;&lt;br&gt;isEmpty プロパティで Dictionary が空かどうか確認する&lt;br&gt;Swift で Dictionary（辞書）の要素が空っぽかどうかを確認するには、isEmpty プロパティが使えます。&lt;br&gt;&lt;br&gt;var dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;print(dict.isEmpty)&lt;br&gt;&lt;br&gt;dict.removeAll()&lt;br&gt;print(dict.isEmpty)&lt;br&gt;実行結果です。removeAll() メソッドで、辞書を空っぽにすると dict.isEmpty が true になりました。&lt;br&gt;&lt;br&gt;false&lt;br&gt;true&lt;br&gt;&lt;br&gt;Dictionary に指定したキーが存在するか確認する&lt;br&gt;Swift で Dictionary（辞書）に指定したキーが存在するかどうか確認するには、辞書の keys プロパティのcontains() メソッドが使えます。&lt;br&gt;&lt;br&gt;例えば、dict 辞書に、Key2 と Key4 が存在する確認するには次のようにできます。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;&lt;br&gt;print(dict.keys.contains(&quot;Key2&quot;))&lt;br&gt;print(dict.keys.contains(&quot;Key4&quot;))&lt;br&gt;実行結果は次のようになり、Key2 は存在するので true、Key4 は存在しないので false が返っています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;以上、Swift の Dictionary（辞書）のキーと値のペアの数とキーの存在を確認する方法などについてご説明しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 16 Oct 2020 23:07:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Dictionary（辞書）- キーと値のペアの削除</title><link>https://softmoco.com/swift-basics/swift-dictionary-remove.php</link><description>Swift の Dictionary（辞書）- キーと値のペアの削除&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Dictionary（辞書）からキーと値のペアの削除する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;removeValue() で Dictionary（辞書）からキーと値のペアの削除する&lt;br&gt;removeAll() で Dictionary の全てのキーと値のペアを削除する&lt;br&gt;removeValue() で Dictionary（辞書）からキーと値のペアの削除する&lt;br&gt;Swift の Dictionary（辞書）では removeValue() メソッドを使ってキーと値のペアを削除することができます。&lt;br&gt;&lt;br&gt;使い方は dictionary.removeValue(forKey: &quot;Key&quot;) のように Key を指定します。&lt;br&gt;&lt;br&gt;removeValue() は削除したキーと値のペアの値を返すので、削除された値が必要な時は戻り値を変数に代入するなどして使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、Dictionary（辞書）から removeValue() メソッドを使ってキーと値のペアを削除してみます。&lt;br&gt;&lt;br&gt;vvar dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;print(dict)&lt;br&gt;&lt;br&gt;let removed = dict.removeValue(forKey: &quot;Key1&quot;)&lt;br&gt;print(dict)&lt;br&gt;print(removed ?? &quot;Nothing is removed.&quot;)&lt;br&gt;実行結果は次のようになり、 Key1 のキーと値のペアが dict から削除されて、削除された値の value1 が removed に取得できています。&lt;br&gt;&lt;br&gt;[&quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;, &quot;Key1&quot;: &quot;value1&quot;]&lt;br&gt;[&quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;value1&lt;br&gt;&lt;br&gt;removeAll() で Dictionary の全てのキーと値のペアを削除する&lt;br&gt;Swift の Dictionary（辞書）の全てのキーと値のペアを削除したい時には removeAll() メソッドを使います。&lt;br&gt;&lt;br&gt;removeAll() を使って全ての要素を削除してみます。&lt;br&gt;&lt;br&gt;var dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;print(dict)&lt;br&gt;&lt;br&gt;dict.removeAll()&lt;br&gt;print(dict)&lt;br&gt;実行結果は次のようになり、全てのキーと値のペアが削除されているのがわかります。&lt;br&gt;&lt;br&gt;[&quot;Key3&quot;: &quot;value3&quot;, &quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;]&lt;br&gt;[:]&lt;br&gt;&lt;br&gt;以上、Swift の Dictionary（辞書）からキーと値のペアの削除する方法についてご説明しました。&lt;br&gt;</description><pubDate>Fri, 16 Oct 2020 23:03:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Dictionary（辞書）- 作成・値の変更・キーと値のペアの追加</title><link>https://softmoco.com/swift-basics/swift-dictionary-modify-add.php</link><description>Swift の Dictionary（辞書）- 作成・値の変更・キーと値のペアの追加&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Dictionary（辞書）について基本的なことと、値の変更方法や、キーと値のペアを追加する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Dictionary（辞書）の基本&lt;br&gt;Swift の Dictionary（辞書）の値を取得する&lt;br&gt;Swift の Dictionary（辞書）の値を変更する&lt;br&gt;Swift の Dictionary（辞書）にキーと値のペアを追加する&lt;br&gt;Swift の Dictionary（辞書）の基本&lt;br&gt;Swift の Dictionary（辞書）は、順序をもたない、キー(Key) と値(Value) が対になった複数のデータの集まりです。&lt;br&gt;&lt;br&gt;キーを指定して値を追加・削除したり、値を取得したりするので、辞書の中のキーは一意でなくてはならず、同じキーは複数存在できません。&lt;br&gt;&lt;br&gt;&lt;br&gt;Dictionary のキーはケースセンシティブで、Set の要素と同様に、Hashable な型でなくてはなりません。&lt;br&gt;&lt;br&gt;Swift の String、Int、Double などの基本的なデータ型は Hashable です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で Dictionary（辞書）作るには何通りか方法があります。&lt;br&gt;&lt;br&gt;例えば、キーが String 型、値が Int 型の辞書オブジェクトを作って空に初期化するには、次のどれかを使います。&lt;br&gt;&lt;br&gt;var dict1:[String: Int] = [:]&lt;br&gt;var dict2 = [String: Int]()&lt;br&gt;var dict3: Dictionary&lt;String, Int&gt; = [:]&lt;br&gt;var dict4 = Dictionary&lt;String, Int&gt;()&lt;br&gt;どれでも同じ型の空の辞書を生成することができますが、Swift の公式ドキュメントでは 1 行目か 2 行目の [Key: Value] を使う方法が推奨されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;その他の変数の定義と同様で、次のようにデータ型を指定せずに値を代入して Dictionary を定義することもできます。&lt;br&gt;&lt;br&gt;var dict = [&quot;Key1&quot;: 10, &quot;Key2&quot;: 5, &quot;Key3&quot;: 7, &quot;Key4&quot;: 10]&lt;br&gt;&lt;br&gt;Dictionary を変更する必要がない時は var ではなくて let で定義します。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: 10, &quot;Key2&quot;: 5, &quot;Key3&quot;: 7, &quot;Key4&quot;: 10]&lt;br&gt;&lt;br&gt;辞書の値のデータ型がキーによって違う場合は Any を指定します。&lt;br&gt;&lt;br&gt;var dict1:[String: Any] = [:]&lt;br&gt;&lt;br&gt;値のデータ型がキーによって違う場合は、辞書オブジェクトを生成するのと同時に値を代入する時に型の省略はできません。&lt;br&gt;&lt;br&gt;var student:[String : Any] = [&quot;Name&quot;: &quot;Suzuki&quot;, &quot;Age&quot;: 15, &quot;Gender&quot;: &quot;M&quot;]&lt;br&gt;それでは、Swift の Dictionary を使っていきましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift の Dictionary（辞書）の値を取得する&lt;br&gt;Swift の Dictionary（辞書）のキーに対応する値を取得するには、角括弧［ ］を使ってキーを指定します。&lt;br&gt;&lt;br&gt;例えば、次のような dict という名前の辞書の、Key1 というキーの値を取得するには次のようにします。&lt;br&gt;&lt;br&gt;取得される値はオプショナルなので、デフォルト値として &quot;Not Found&quot; を指定しています。&lt;br&gt;&lt;br&gt;let dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;&lt;br&gt;print(dict[&quot;Key1&quot;] ?? &quot;Not Found&quot;)&lt;br&gt;実行結果です。 Key1 キーに対応する値の value1 が出力されています。&lt;br&gt;&lt;br&gt;value1&lt;br&gt;&lt;br&gt;Swift の Dictionary（辞書）の値を変更する&lt;br&gt;Swift の Dictionary（辞書）の値を変更するには、角括弧［ ］を使ってキーを指定し、そこに新しい値を代入します。&lt;br&gt;&lt;br&gt;その時、値のデータ型が Any でない場合は、違うデータ型の値を代入しようとするとエラーになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、 Key1 というキーの値を value11 に変更したい時は次のようにします。&lt;br&gt;&lt;br&gt;Dictionary を変更するので、変数の定義の箇所を let から var に変えています。&lt;br&gt;&lt;br&gt;var dict = [&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;print(dict)&lt;br&gt;&lt;br&gt;dict[&quot;Key1&quot;] = &quot;value11&quot;&lt;br&gt;print(dict)&lt;br&gt;実行結果は次のようになり、 Key1 の値が &quot;value11&quot; に変更されていますね。&lt;br&gt;&lt;br&gt;[&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;[&quot;Key1&quot;: &quot;value11&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;Swift の Dictionary（辞書）- 要素の変更・追加 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Dictionary（辞書）にキーと値のペアを追加する&lt;br&gt;Swift の Dictionary（辞書）にキーと値のペアを追加するには、角括弧［ ］を使って新しいキーを指定して値を代入します。&lt;br&gt;&lt;br&gt;空っぽの Dictionary（辞書）を定義して、キーと値のペアを三つ追加してみます。&lt;br&gt;&lt;br&gt;var dict: [String: String] = [:]&lt;br&gt;print(dict)&lt;br&gt;&lt;br&gt;dict[&quot;Key1&quot;] = &quot;value1&quot;&lt;br&gt;print(dict)&lt;br&gt;&lt;br&gt;dict[&quot;Key2&quot;] = &quot;value2&quot;&lt;br&gt;print(dict)&lt;br&gt;&lt;br&gt;dict[&quot;Key3&quot;] = &quot;value3&quot;&lt;br&gt;print(dict)&lt;br&gt;実行結果は次のようになり、キーと値のペアが Dictionary（辞書）に追加されていっています。&lt;br&gt;&lt;br&gt;[:]&lt;br&gt;[&quot;Key1&quot;: &quot;value1&quot;]&lt;br&gt;[&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;]&lt;br&gt;[&quot;Key1&quot;: &quot;value1&quot;, &quot;Key2&quot;: &quot;value2&quot;, &quot;Key3&quot;: &quot;value3&quot;]&lt;br&gt;&lt;br&gt;以上、Swift の Dictionary（辞書）について基本的なことと、値の変更方法や、キーと値のペアを追加する方法についてご説明しました。&lt;br&gt;</description><pubDate>Fri, 16 Oct 2020 23:01:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Dictionary（辞書）</title><link>https://softmoco.com/swift-basics/swift-dictionary.php</link><description>Swift の Dictionary（辞書）&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift には、複数の値の集合を格納する主要なデータ型に、Array（配列）、Set（セット）、Dictionay（辞書）があります。&lt;br&gt;&lt;br&gt;ここでは基本的な Swift の Dictionary（辞書）の使い方についてご説明します。&lt;br&gt;&lt;br&gt;Swift の Dictionary（辞書）- 作成・値の変更・キーと値のペアの追加&lt;br&gt;Swift の Dictionary（辞書）の基本&lt;br&gt;Swift の Dictionary（辞書）の値を取得する&lt;br&gt;Swift の Dictionary（辞書）の値を変更する&lt;br&gt;Swift の Dictionary（辞書）にキーと値のペアを追加する&lt;br&gt;Swift の Dictionary（辞書）- キーと値のペアの削除&lt;br&gt;removeValue() で Dictionary（辞書）からキーと値のペアの削除する&lt;br&gt;removeAll() で Dictionary の全てのキーと値のペアを削除する&lt;br&gt;Swift の Dictionary（辞書）- キーと値のペア数とキーの存在確認&lt;br&gt;count プロパティで Dictionary のキーと値のペアの数を取得する&lt;br&gt;isEmpty プロパティで Dictionary が空かどうか確認する&lt;br&gt;Dictionary に指定したキーが存在するか確認する&lt;br&gt;Swift の Dictionary（辞書）- ループ・mapValue・filter&lt;br&gt;Swift の Dictionary（辞書）のキーと値をループする&lt;br&gt;Swift の Dictionary（辞書）のキーのみ、値のみをループする&lt;br&gt;mapValue() で値を変換した Dictionary を生成する&lt;br&gt;filter() でフィルターしたキーと値を持つ Dictionary を生成する</description><pubDate>Fri, 16 Oct 2020 23:00:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）部分集合・上位集合・交わるか</title><link>https://softmoco.com/swift-basics/swift-set-membership-equality.php</link><description>Swift の Set（セット）部分集合・上位集合・交わるか&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の二つの Set（セット）が、部分集合か、上位集合か、交わるかなどの判定する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;== で二つの Set（セット）が等しいか判断する&lt;br&gt;isSubset() で Set（セット）が部分集合か判断する&lt;br&gt;isSuperset() で Set（セット）が上位集合か判断する&lt;br&gt;isDisjoint() で Set（セット）に交わりがないか判断する&lt;br&gt;&lt;br&gt;== で二つの Set（セット）が等しいか判断する&lt;br&gt;Swift の二つの Set（セット）が等しいかどうかは == を使って判断することができます。&lt;br&gt;&lt;br&gt;その時に、Set の要素の順番は等しいかどうかには関係ありません。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5, 6, 7, 8]&lt;br&gt;let set2: Set = [3, 6, 9, 12]&lt;br&gt;let set3: Set = [4, 7, 6, 5, 8, 2, 1, 3]&lt;br&gt;&lt;br&gt;print(set1 == set2)&lt;br&gt;print(set1 == set3)&lt;br&gt;実行結果は次のようになり、 set1 と set2 は要素が違うので false、set1 と set3 は要素が同じなので true になっています。&lt;br&gt;&lt;br&gt;false&lt;br&gt;true&lt;br&gt;Swift の Set（セット）部分集合・上位集合・交わるか 1&lt;br&gt;&lt;br&gt;&lt;br&gt;isSubset() で Set（セット）が部分集合か判断する&lt;br&gt;Swift の Set（セット）の isSubset() メソッドを使って、引数に指定した Set の部分集合かどうかを判断することができます。&lt;br&gt;&lt;br&gt;isSubset() は二つの Set の要素が同じ時に true を返しますが、同じ時は false にしたい時は isStrictSubset() メソッドを使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、isSubset() と isStrictSubset() を使って、set1 が他の Set の部分集合かどうか確認してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4]&lt;br&gt;let set2: Set = [4, 2, 3, 1]&lt;br&gt;let set3: Set = [1, 2, 3, 4, 5]&lt;br&gt;let set4: Set = [2, 3, 4, 5, 6]&lt;br&gt;&lt;br&gt;print(set1.isSubset(of: set2))&lt;br&gt;print(set1.isStrictSubset(of: set2))&lt;br&gt;print(set1.isSubset(of: set3))&lt;br&gt;print(set1.isSubset(of: set4))&lt;br&gt;実行結果は次のようになります。 isSubset() のほうは、set1 が引数に渡したセットと同じか部分集合の時は true になっています。set1 と set2 は同じなので isStrictSubset() を使うと false になっています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;isSuperset() で Set（セット）が上位集合か判断する&lt;br&gt;Swift の Set（セット）の isSuperset() メソッドを使って、引数に指定した Set の上位集合（スーパーセット）かどうかを判断することができます。&lt;br&gt;&lt;br&gt;isSuperset() は二つの Set の要素が同じ時に true を返しますが、同じ時は false にしたい時は isStrictSuperset() メソッドを使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、isSuperset() と isStrictSuperset() を使って、set1 が他の Set の上位集合かどうか確認してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5]&lt;br&gt;let set2: Set = [5, 2, 4, 3, 1]&lt;br&gt;let set3: Set = [1, 2, 3, 4]&lt;br&gt;let set4: Set = [3, 4, 5, 6]&lt;br&gt;&lt;br&gt;print(set1.isSuperset(of: set2))&lt;br&gt;print(set1.isStrictSuperset(of: set2))&lt;br&gt;print(set1.isSuperset(of: set3))&lt;br&gt;print(set1.isSuperset(of: set4))&lt;br&gt;実行結果は次のようになります。 isSuperset() のほうは、set1 が引数に渡したセットと同じか上位集合の時は true になっています。set1 と set2 は同じなので isStrictSuperset() を使うと false になっています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;isDisjoint() で Set（セット）に交わりがないか判断する&lt;br&gt;Swift の Set（セット）の isDisjoint() メソッドを使って、二つのセットが交わっていないか判断することができます。&lt;br&gt;&lt;br&gt;二つのセットの要素の中に、ひとつでも同じ要素があった場合は false を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、isDisjoint() を使って、set1 が他の Set と交わるか確認してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5]&lt;br&gt;let set2: Set = [6, 7, 8]&lt;br&gt;let set3: Set = [5, 6, 7]&lt;br&gt;&lt;br&gt;print(set1.isDisjoint(with: set2))&lt;br&gt;print(set1.isDisjoint(with: set3))&lt;br&gt;実行結果は次のようになります。 set1 と set2 は同じ要素がないので true、set1 と set3 は 5 という同じ要素があるので false を返しています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;以上、Swift の二つの Set（セット）が、部分集合か、上位集合か、交わるかなどの判定する方法についてご説明しました。</description><pubDate>Sun, 11 Oct 2020 07:40:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）で集合の演算</title><link>https://softmoco.com/swift-basics/swift-set-operation.php</link><description>Swift の Set（セット）で集合の演算&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Set（セット）で集合の演算をする方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;intersection() で Set（セット）の積集合を取得する&lt;br&gt;union() で Set（セット）の和集合を取得する&lt;br&gt;subtracting() で Set（セット）の差集合を取得する&lt;br&gt;symmetricDifference() で Set（セット）の対称差集合を取得する&lt;br&gt;intersection() で Set（セット）の積集合を取得する&lt;br&gt;Swift の Set（セット）の intersection() メソッドを使って、もうひとつの Set と同じ要素だけを持つ Set を取得することができます。&lt;br&gt;&lt;br&gt;Swift の Set（セット）オペレーション 1&lt;br&gt;&lt;br&gt;&lt;br&gt;実際に intersection() メソッドを使って、二つのセットの共通部分の要素を持つ Set を取得してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5, 6, 7, 8]&lt;br&gt;let set2: Set = [3, 6, 9, 12]&lt;br&gt;&lt;br&gt;let set3 = set1.intersection(set2)&lt;br&gt;print(set3)&lt;br&gt;実行結果は次のようになり、 set1 にも set2 にも存在する 3 と 6 を要素に持つ Set が取得できました。&lt;br&gt;&lt;br&gt;[3, 6]&lt;br&gt;&lt;br&gt;union() で Set（セット）の和集合を取得する&lt;br&gt;Swift の Set（セット）の union() メソッドを使って、もうひとつの Set との和集合の要素持つ Set を取得することができます。&lt;br&gt;&lt;br&gt;Swift の Set（セット）オペレーション 2&lt;br&gt;&lt;br&gt;&lt;br&gt;実際に union() メソッドを使って、二つのセットの和集合の要素を持つ Set を取得してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5, 6, 7, 8]&lt;br&gt;let set2: Set = [3, 6, 9, 12]&lt;br&gt;&lt;br&gt;let set3 = set1.union(set2)&lt;br&gt;print(set3)&lt;br&gt;実行結果は次のようになり、 set1 と set2 の和集合をを要素に持つ Set が取得できました。&lt;br&gt;&lt;br&gt;[9, 4, 2, 3, 5, 7, 8, 12, 6, 1]&lt;br&gt;&lt;br&gt;subtracting() で Set（セット）の差集合を取得する&lt;br&gt;Swift の Set（セット）の subtracting() メソッドを使って、もうひとつの Set との差集合の要素持つ Set を取得することができます。&lt;br&gt;&lt;br&gt;Swift の Set（セット）オペレーション 3&lt;br&gt;&lt;br&gt;&lt;br&gt;実際に subtracting() メソッドを使って、二つのセットの差集合の要素を持つ Set を取得してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5, 6, 7, 8]&lt;br&gt;let set2: Set = [3, 6, 9, 12]&lt;br&gt;&lt;br&gt;let set3 = set1.subtracting(set2)&lt;br&gt;print(set3)&lt;br&gt;実行結果は次のようになり、 set1 から、set2 と共通する 3, 6 がなくなったの差集合を要素に持つ Set が取得できました。&lt;br&gt;&lt;br&gt;[4, 7, 8, 1, 5, 2]&lt;br&gt;&lt;br&gt;symmetricDifference() で Set（セット）の対称差集合を取得する&lt;br&gt;Swift の Set（セット）の symmetricDifference() メソッドを使って、もうひとつの Set との対称差集合の要素持つ Set を取得することができます。&lt;br&gt;&lt;br&gt;Swift の Set（セット）オペレーション 4&lt;br&gt;&lt;br&gt;&lt;br&gt;実際に subtracting() メソッドを使って、二つのセットの対称差集合の要素を持つ Set を取得してみます。&lt;br&gt;&lt;br&gt;let set1: Set = [1, 2, 3, 4, 5, 6, 7, 8]&lt;br&gt;let set2: Set = [3, 6, 9, 12]&lt;br&gt;&lt;br&gt;let set3 = set1.symmetricDifference(set2)&lt;br&gt;print(set3)&lt;br&gt;実行結果は次のようになり、 set1 と set2 の和集合から、 set1 と set2 の積集合を除いた要素に持つ Set が取得できました。&lt;br&gt;&lt;br&gt;[4, 8, 5, 1, 12, 9, 2, 7]&lt;br&gt;&lt;br&gt;以上、Swift の Set（セット）で集合の演算をする方法についてご説明しました。&lt;br&gt;</description><pubDate>Sun, 11 Oct 2020 07:39:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）- ループ・map・filter</title><link>https://softmoco.com/swift-basics/swift-set-loop-map-filter.php</link><description>Swift の Set（セット）- ループ・map・filter&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Set（セット）のループ方法と、filter・map メソッドの使い方についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Set（セット）をループする&lt;br&gt;map() で Set（セット）から要素を変換した Array を生成する&lt;br&gt;filter() で要素をフィルターした Set を生成する&lt;br&gt;Swift の Set（セット）をループする&lt;br&gt;Swift の Set（セット）をループするには、何通りか方法があります。&lt;br&gt;&lt;br&gt;一番ベーシックな方法は for-in ループを使う方法です。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;for number in numbers {&lt;br&gt;    print(number)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、要素が全て print されています。Set は順序を保たない値の集合なので、順番は Insert に指定した順番とは違っています。&lt;br&gt;&lt;br&gt;2&lt;br&gt;4&lt;br&gt;5&lt;br&gt;3&lt;br&gt;1&lt;br&gt;Swift の Set（セット）- ループ・map・filter 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Array と同様に forEach() メソッドを使っても同じように、Set の要素を print することができます。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;numbers.forEach { number in&lt;br&gt;    print(number)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、要素が全て print されています。&lt;br&gt;&lt;br&gt;2&lt;br&gt;5&lt;br&gt;4&lt;br&gt;1&lt;br&gt;3&lt;br&gt;&lt;br&gt;for-in ループとの違いは forEach() では break や continue が使えないことなどがあげられます。&lt;br&gt;&lt;br&gt;ループ処理の途中で何かの条件で break、continue、return したいような時は for-in ループを使ってください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Set は要素の順番を意識しないユニークな値の集合ですが、Insert された時に値が格納される順番が決まって、その場所は固定されています。&lt;br&gt;&lt;br&gt;同じコードを実行しても、実行する度にその順番は変わることが多いです。&lt;br&gt;&lt;br&gt;enumerated() を使ってループすると、一応インデックスも取得できます。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;for (index, number) in numbers.enumerated() {&lt;br&gt;  print(&quot;\(index): \(number)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになります。 配列のようにインデックスではアクセスできませんが、Set の要素のインデックスも取得できます。&lt;br&gt;&lt;br&gt;0: 3&lt;br&gt;1: 1&lt;br&gt;2: 5&lt;br&gt;3: 2&lt;br&gt;4: 4&lt;br&gt;&lt;br&gt; &lt;br&gt;map() で Set（セット）から要素を変換した Array を生成する&lt;br&gt;Swift の Set（セット）の map() メソッドを使って、要素を変換した Array（配列）を生成することができます。&lt;br&gt;&lt;br&gt;例えば、全ての要素を 10 倍した要素を持つ Array を生成したい時は次のようにできます。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;let numbers10 = numbers.map { $0 * 10 }&lt;br&gt;&lt;br&gt;print(numbers)&lt;br&gt;print(numbers10)&lt;br&gt;print(type(of: numbers10))&lt;br&gt;実行結果は次のようになり、numbers10 の要素は全て 10 倍になっていて、データ型が Array になっていますね。&lt;br&gt;&lt;br&gt;[1, 2, 4, 5, 3]&lt;br&gt;[10, 20, 40, 50, 30]&lt;br&gt;Array&lt;Int&gt;&lt;br&gt;Set 型で取得したい時は、Set(numbers.map { $0 * 10 }) のようにすると、Set 型にできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;filter() で要素をフィルターした Set を生成する&lt;br&gt;Swift の filter() メソッドを使って、Set（セット）から指定した条件を満たす要素だけを含んだ Set を生成することができます。&lt;br&gt;&lt;br&gt;例えば、次のような numbers セットの中で、2 で割り切れるものだけを要素とした Set を生成するには次のようにできます。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5, 6, 7, 8]&lt;br&gt;let numbers2 = numbers.filter { (number) in&lt;br&gt;    return number % 2 == 0&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(numbers)&lt;br&gt;print(numbers2)&lt;br&gt;print(type(of: numbers2))&lt;br&gt;実行結果は次のようになり、numbers2 には 2 で割り切れる要素だけが含まれ、型は map() と違って Set になっていますね。&lt;br&gt;&lt;br&gt;[3, 8, 5, 7, 6, 4, 2, 1]&lt;br&gt;[2, 4, 8, 6]&lt;br&gt;Set&lt;Int&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Set（セット）のループ方法と、filter・map メソッドの使い方についてご説明しました。</description><pubDate>Sun, 11 Oct 2020 07:38:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）- 要素数と要素の存在確認</title><link>https://softmoco.com/swift-basics/swift-set-inspect.php</link><description>Swift の Set（セット）- 要素数と要素の存在確認&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Set（セット）の要素数を取得する方法、セットが空っぽか確認する方法、要素が存在するか確認する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;count プロパティで Set（セット）の要素の数を取得する&lt;br&gt;isEmpty プロパティで Set（セット）が空かどうか確認する&lt;br&gt;contains() で Set（セット）に指定した要素が存在するか確認する&lt;br&gt;count プロパティで Set（セット）の要素の数を取得する&lt;br&gt;Swift の Set（セット）の中の要素の数を取得したい時には Set の count プロパティを使います。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;print(numbers.count)&lt;br&gt;実行結果は次のようになり、5 つの要素があるので 5 と出力されています。&lt;br&gt;&lt;br&gt;5&lt;br&gt;&lt;br&gt;isEmpty プロパティで Set（セット）が空かどうか確認する&lt;br&gt;Swift で Set（セット）の要素が空っぽかどうかを確認するには、isEmpty プロパティが使えます。&lt;br&gt;&lt;br&gt;var numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;print(numbers.isEmpty)&lt;br&gt;&lt;br&gt;numbers.removeAll()&lt;br&gt;print(numbers.isEmpty)&lt;br&gt;実行結果です。removeAll() メソッドで、配列を空っぽにすると names.isEmpty が true になりました。&lt;br&gt;&lt;br&gt;false&lt;br&gt;true&lt;br&gt;&lt;br&gt;contains() で Set（セット）に指定した要素が存在するか確認する&lt;br&gt;Swift で Set（セット）に指定した要素が存在するかどうか確認するには contains() メソッドが使えます。&lt;br&gt;&lt;br&gt;例えば、numbers セットに、3 と 6 が存在する確認するには次のようにできます。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;print(numbers.contains(3))&lt;br&gt;print(numbers.contains(6))&lt;br&gt;実行結果は次のようになり、3 は存在するので true、6 は存在しないので false が返っています。&lt;br&gt;&lt;br&gt;true&lt;br&gt;false&lt;br&gt;&lt;br&gt;以上、Swift の Set（セット）の要素数を取得する方法、セットが空っぽか確認する方法、要素が存在するか確認する方法についてご説明しました。</description><pubDate>Sun, 11 Oct 2020 07:37:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）- 要素の削除</title><link>https://softmoco.com/swift-basics/swift-set-remove.php</link><description>Swift の Set（セット）- 要素の削除&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Set（セット）から要素を削除する方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;remove() で Set（セット）から要素を指定して削除する&lt;br&gt;removeFirst()・popFirst() で Set の最初の要素を削除する&lt;br&gt;removeAll() で Set の全ての要素を削除する&lt;br&gt;remove() で Set（セット）から要素を指定して削除する&lt;br&gt;Swift の Set（セット）では remove() メソッドを使って、要素を指定して削除することができます。&lt;br&gt;&lt;br&gt;remove() は削除した要素を返すので、削除された要素が必要な時は戻り値を変数に代入するなどして使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、Set（セット）から要素を remove() メソッドを使って削除してみましょう。&lt;br&gt;&lt;br&gt;remove() が返す Element はオプショナルなので、要素が存在せず nil が返った時のために &quot;Not found&quot; というデフォルト値を指定しています。&lt;br&gt;&lt;br&gt;var numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;print(numbers)&lt;br&gt;&lt;br&gt;let removed = numbers.remove(4)&lt;br&gt;print(numbers)&lt;br&gt;print(removed ?? &quot;Not found&quot;)&lt;br&gt;実行結果は次のようになり、 指定した 4 が numbers セットから削除されて、removed に取得できています。&lt;br&gt;&lt;br&gt;[2, 5, 3, 4, 1]&lt;br&gt;[2, 5, 3, 1]&lt;br&gt;4&lt;br&gt;&lt;br&gt;removeFirst()・popFirst() で Set の最初の要素を削除する&lt;br&gt;Swift の Set（セット）の最初の要素を削除したい時には removeFirst() や popFirst() メソッドを使います。&lt;br&gt;&lt;br&gt;どちらも Set の一番最初の要素を削除して、戻り値として削除した要素を返します。&lt;br&gt;&lt;br&gt;二つのメソッドの違いは、popFirst() はセットに要素がなくても大丈夫ですが、removeFirst() はセットに要素がないとエラーになります。&lt;br&gt;&lt;br&gt;popFirst() の戻り値の要素はオプショナルで、セットが空の時は nil が返ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、removeFirst() と popFirst() 使って要素を削除してみましょう。&lt;br&gt;&lt;br&gt;var numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;print(numbers)&lt;br&gt;&lt;br&gt;let removed1 = numbers.removeFirst()&lt;br&gt;print(numbers)&lt;br&gt;print(removed1)&lt;br&gt;&lt;br&gt;let removed2 = numbers.popFirst()&lt;br&gt;print(numbers)&lt;br&gt;print(removed2 ?? &quot;Not found&quot;)&lt;br&gt;実行結果は次のようになり、 それぞれ numbers セットの一番前の要素が削除されて、removed1・ removed2 に取得できています。&lt;br&gt;&lt;br&gt;[3, 4, 2, 1, 5]&lt;br&gt;[4, 5, 2, 1]&lt;br&gt;3&lt;br&gt;[5, 2, 1]&lt;br&gt;4&lt;br&gt;Swift の Set（セット）- 要素の削除 1&lt;br&gt;&lt;br&gt;&lt;br&gt;removeAll() で Set の全ての要素を削除する&lt;br&gt;Swift の Set（セット）の全ての要素を削除したい時には removeAll() メソッドを使います。&lt;br&gt;&lt;br&gt;removeAll() を使って全ての要素を削除してみます。&lt;br&gt;&lt;br&gt;var numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;print(numbers)&lt;br&gt;&lt;br&gt;numbers.removeAll()&lt;br&gt;print(numbers)&lt;br&gt;実行結果は次のようになり、全ての要素が削除されているのがわかります。&lt;br&gt;&lt;br&gt;[5, 3, 1, 2, 4]&lt;br&gt;[]&lt;br&gt;&lt;br&gt;以上、Swift の Set（セット）から要素を削除する方法についてご説明しました。&lt;br&gt;</description><pubDate>Sun, 11 Oct 2020 07:35:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）- 生成と要素の追加</title><link>https://softmoco.com/swift-basics/swift-set-declare-add.php</link><description>Swift の Set（セット）- 生成と要素の追加&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Set（セット）について基本的なことと、要素の追加の方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Set（セット）の基本&lt;br&gt;Swift の Set（セット）を生成する&lt;br&gt;insert() で Set（セット）に要素を追加する&lt;br&gt;Swift の Set（セット）の基本&lt;br&gt;Swift の Array（配列）は要素の順序があり、同じ値の要素を複数格納できましたが、Set（セット）は順序のない、ユニークな値の集合です。&lt;br&gt;&lt;br&gt;Set は要素の順番を保持しないので、Array のように array[0] のようにインデックスを指定して要素にアクセスできません。&lt;br&gt;&lt;br&gt; ただ実際は一度 Set に値が Insert されると、各要素の場所は固定されていて、要素の Set.Index を調べて、その Set.Index を引数として使えるメソッドもあります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Set（セット）の要素のデータ型は、Dictionay（辞書）のキーと同様で Hashable な型でなくてはなりません。&lt;br&gt;&lt;br&gt;Swift の String、Int、Double などの基本的なデータ型は Hashable です。&lt;br&gt;&lt;br&gt;Swift の Set（セット）- 要素の変更・追加 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Set（セット）を生成する&lt;br&gt;Swift で Set（セット）を作りたい時は、Set&lt;データ型&gt; のようにデータ型を指定します。&lt;br&gt;&lt;br&gt;例えば、numbers という Int の Set を作って、空に初期化したい時は、次のようにできます。&lt;br&gt;&lt;br&gt;var numbers = Set&lt;Int&gt;()&lt;br&gt;var numbers: Set&lt;Int&gt; = []&lt;br&gt;&lt;br&gt;Set の生成と同時に Array リテラルで値を代入することもできます。&lt;br&gt;&lt;br&gt;var numbers: Set&lt;Int&gt; = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;次のように要素のデータ型を省略することもできますが、Set がないと Array になってしまうので、Set は省略はできません。&lt;br&gt;&lt;br&gt;var numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;Set を変更する必要がない時は var ではなくて let で定義します。&lt;br&gt;&lt;br&gt;let numbers: Set = [1, 2, 3, 4, 5]&lt;br&gt;&lt;br&gt;Set の要素は順序を持たないので、定義した numbers を print してみると、代入した順番と違うことがわかると思います。また、何度か実行すると、順序が変わることもあります。&lt;br&gt;&lt;br&gt;Swift の Set（セット）- 要素の変更・追加 2&lt;br&gt;&lt;br&gt;それでは、Swift の Set を使っていきましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;insert() で Set（セット）に要素を追加する&lt;br&gt;Swift の Set（セット）に要素を追加するには、insert() という名前のメソッドを使います。&lt;br&gt;&lt;br&gt;既に要素に存在する値を insert しようとしても、insert されないだけでエラーにはなりません。&lt;br&gt;&lt;br&gt;&lt;br&gt;空っぽの Set を定義して、insert() を使って要素を三つ追加してみます。&lt;br&gt;&lt;br&gt;var numbers: Set&lt;Int&gt; = []&lt;br&gt;&lt;br&gt;numbers.insert(1)&lt;br&gt;print(numbers)&lt;br&gt;&lt;br&gt;numbers.insert(2)&lt;br&gt;print(numbers)&lt;br&gt;&lt;br&gt;numbers.insert(3)&lt;br&gt;print(numbers)&lt;br&gt;実行結果は次のようになり、 順序は保たず numbers セットに値が追加されていっています。&lt;br&gt;&lt;br&gt;[1]&lt;br&gt;[2, 1]&lt;br&gt;[2, 3, 1]&lt;br&gt;Swift の Set（セット）- 要素の変更・追加 3&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Set（セット）について基本的なことと、要素の追加の方法についてご説明しました。&lt;br&gt;</description><pubDate>Sun, 11 Oct 2020 07:32:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Set（セット）</title><link>https://softmoco.com/swift-basics/swift-set.php</link><description>Swift の Set（セット）&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift には、複数の値の集合を格納する主要なデータ型に、Array（配列）、Set（セット）、Dictionay（辞書）があります。&lt;br&gt;&lt;br&gt;ここでは基本的な Swift の Set（セット）の使い方についてご説明します。&lt;br&gt;&lt;br&gt;Swift の Set（セット）- 生成と要素の追加&lt;br&gt;Swift の Set（セット）の基本&lt;br&gt;Swift の Set（セット）を生成する&lt;br&gt;insert() で Set（セット）に要素を追加する&lt;br&gt;Swift の Set（セット）- 要素の削除&lt;br&gt;remove() で Set（セット）から要素を指定して削除する&lt;br&gt;removeFirst()・popFirst() で Set の最初の要素を削除する&lt;br&gt;removeAll() で Set の全ての要素を削除する&lt;br&gt;Swift の Set（セット）- 要素数と要素の存在確認&lt;br&gt;count プロパティで Set（セット）の要素の数を取得する&lt;br&gt;isEmpty プロパティで Set（セット）が空かどうか確認する&lt;br&gt;contains() で Set（セット）に指定した要素が存在するか確認する&lt;br&gt;Swift の Set（セット）- ループ・map・filter&lt;br&gt;Swift の Set（セット）をループする&lt;br&gt;map() で Set（セット）から要素を変換した Array を生成する&lt;br&gt;filter() で要素をフィルターした Set を生成する&lt;br&gt;Swift の Set（セット）で集合の演算&lt;br&gt;intersection() で Set（セット）の積集合を取得する&lt;br&gt;union() で Set（セット）の和集合を取得する&lt;br&gt;subtracting() で Set（セット）の差集合を取得する&lt;br&gt;symmetricDifference() で Set（セット）の対称差集合を取得する&lt;br&gt;Swift の Set（セット）部分集合・上位集合・交わるか&lt;br&gt;== で二つの Set（セット）が等しいか判断する&lt;br&gt;isSubset() で Set（セット）が部分集合か判断する&lt;br&gt;isSuperset() で Set（セット）が上位集合か判断する&lt;br&gt;isDisjoint() で Set（セット）に交わりがないか判断する&lt;br&gt;</description><pubDate>Sun, 11 Oct 2020 07:31:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Array（配列）- ループ・map・filter</title><link>https://softmoco.com/swift-basics/swift-array-loop-map-filter.php</link><description>Swift の Array（配列）- ループ・map・filter&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Array（配列）のループ方法と、filter・map メソッドの使い方についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Array（配列）をループする&lt;br&gt;map() で要素を変換した配列を生成する&lt;br&gt;filter() で要素をフィルターした配列を生成する&lt;br&gt;Swift の Array（配列）をループする&lt;br&gt;Swift の Array（配列）をループするには、何通りか方法があります。&lt;br&gt;&lt;br&gt;一番ベーシックな方法は for-in ループを使う方法です。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;for name in names {&lt;br&gt;    print(name)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、要素が前から順番に print されています。&lt;br&gt;&lt;br&gt;Tanaka&lt;br&gt;Suzuki&lt;br&gt;Sato&lt;br&gt;Yamada&lt;br&gt;&lt;br&gt;forEach() メソッドを使っても同じように、名前を print することができます。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;names.forEach { name in&lt;br&gt;    print(name)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、先ほど同様に要素が前から順番に print されています。&lt;br&gt;&lt;br&gt;Tanaka&lt;br&gt;Suzuki&lt;br&gt;Sato&lt;br&gt;Yamada&lt;br&gt;for-in ループとの違いは forEach() では break や continue が使えないことなどがあげられます。&lt;br&gt;&lt;br&gt;ループ処理の途中で何かの条件で break、continue、return したいような時は for-in ループを使ってください。&lt;br&gt;&lt;br&gt;&lt;br&gt;ループで処理をする時に、要素のインデックスも取得したい時は enumerated() を使って、次のようにループできます。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;for (index, name) in names.enumerated() {&lt;br&gt;  print(&quot;\(index): \(name)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、要素のインデックスも取得できています。&lt;br&gt;&lt;br&gt;0: Tanaka&lt;br&gt;1: Suzuki&lt;br&gt;2: Sato&lt;br&gt;3: Yamada&lt;br&gt;&lt;br&gt; &lt;br&gt;map() で要素を変換した配列を生成する&lt;br&gt;Swift の Array（配列）の map() メソッドを使って、要素を変換した配列を生成することができます。&lt;br&gt;&lt;br&gt;例えば、名前を全部大文字に変換した配列を生成したい時は次のようにできます。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;let names_upper = names.map { $0.uppercased() }&lt;br&gt;&lt;br&gt;print(names)&lt;br&gt;print(names_upper)&lt;br&gt;実行結果は次のようになり、names_upper 配列の要素は全て大文字になっています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;TANAKA&quot;, &quot;SUZUKI&quot;, &quot;SATO&quot;, &quot;YAMADA&quot;]&lt;br&gt;&lt;br&gt;map() を使って、構造体やクラスオブジェクトの配列から特定のプロパティを取り出して配列にすることもできます。&lt;br&gt;&lt;br&gt;例えば、次のような Student という構造体を要素として持つ students 配列から、studentsNames という student の name だけを持つ配列を生成するには次のようにできます。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;}&lt;br&gt;&lt;br&gt;let students = [&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Suzuki&quot;, age: 9),&lt;br&gt;    Student(name: &quot;Sato&quot;, age: 8),&lt;br&gt;    Student(name: &quot;Yamada&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 11)&lt;br&gt;]&lt;br&gt;&lt;br&gt;let studentsNames = students.map({ (student) -&gt; String in&lt;br&gt;    return student.name&lt;br&gt;})&lt;br&gt;&lt;br&gt;print(studentsNames)&lt;br&gt;実行結果は次のようになり、名前だけの配列が生成されました。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;, &quot;Tanaka&quot;]&lt;br&gt;Swift の Array（配列）- ループ・map・filter 1&lt;br&gt;&lt;br&gt;このように、map() は現在の配列を変換して、新しい配列を生成したい時に便利です。&lt;br&gt;&lt;br&gt;&lt;br&gt;filter() で要素をフィルターした配列を生成する&lt;br&gt;Swift の filter() メソッドを使って、指定した条件を満たす要素だけを含んだ配列を生成することができます。&lt;br&gt;&lt;br&gt;例えば、次のような names 配列の中で、S で始まる name の要素を含む新しい配列を生成するには次のようにできます。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;let s_names = names.filter { (name) in&lt;br&gt;    return name.hasPrefix(&quot;S&quot;)&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(names)&lt;br&gt;print(s_names)&lt;br&gt;実行結果は次のようになり、s_names 配列には S から始まる名前だけが要素として入っていますね。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Suzuki&quot;, &quot;Sato&quot;]&lt;br&gt;Swift の Array（配列）- ループ・map・filter 2&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Array（配列）のループ方法と、filter・map メソッドの使い方についてご説明しました。</description><pubDate>Wed, 07 Oct 2020 00:37:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Array（配列）- 要素の並べ替え</title><link>https://softmoco.com/swift-basics/swift-array-sort.php</link><description>Swift の Array（配列）- 要素の並べ替え&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Array（配列）の要素を並べ替える方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;sort() で Array（配列）の要素を並べ替える&lt;br&gt;sort() で 配列の構造体やクラスオブジェクトの要素を並べ替える&lt;br&gt;sorted() で要素が並び替えられた Array（配列）を取得する&lt;br&gt;reverse() で要素の並び順を反対にする&lt;br&gt;sort() で Array（配列）の要素を並べ替える&lt;br&gt;Swift の Array（配列）の要素を並べ替えるには、sort() メソッドが使えます。&lt;br&gt;&lt;br&gt;例えば、以下のような names という配列の要素をアルファベット順に並べるには、次のようにします。&lt;br&gt;&lt;br&gt;var names = [ &quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.sort()&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになります。names 配列の要素の順番が、名前のアルファベット順にソートされています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Sato&quot;, &quot;Suzuki&quot;, &quot;Tanaka&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;アルファベットの降順にしたい時は、sort(by: &gt;) とすることで、先ほどの反対の順番になります。&lt;br&gt;&lt;br&gt;var names = [ &quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.sort(by: &gt;)&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、アルファベットの降順になっています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Yamada&quot;, &quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;]&lt;br&gt;&lt;br&gt;sort() で 配列の構造体やクラスオブジェクトの要素を並べ替える&lt;br&gt;続いて sort() メソッドを使って、配列の要素が構造体オブジェクトの場合の並べ替えをしてみます。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような Student 構造体のオブジェクトが要素の students という配列があります。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;}&lt;br&gt;&lt;br&gt;var students = [&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Suzuki&quot;, age: 9),&lt;br&gt;    Student(name: &quot;Sato&quot;, age: 8),&lt;br&gt;    Student(name: &quot;Yamada&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 11)&lt;br&gt;]&lt;br&gt;&lt;br&gt;for s in students {&lt;br&gt;    print(&quot;Name: \(s.name), Age: \(s.age)&quot;)&lt;br&gt;}&lt;br&gt;Name: Tanaka, Age: 10&lt;br&gt;Name: Suzuki, Age: 9&lt;br&gt;Name: Sato, Age: 8&lt;br&gt;Name: Yamada, Age: 10&lt;br&gt;Name: Tanaka, Age: 11&lt;br&gt;&lt;br&gt;この配列を名前順にソートするには次のようにできます。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;}&lt;br&gt;&lt;br&gt;var students = [&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Suzuki&quot;, age: 9),&lt;br&gt;    Student(name: &quot;Sato&quot;, age: 8),&lt;br&gt;    Student(name: &quot;Yamada&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 11)&lt;br&gt;]&lt;br&gt;&lt;br&gt;students.sort(by: {$0.name &lt; $1.name})&lt;br&gt;&lt;br&gt;for s in students {&lt;br&gt;    print(&quot;Name: \(s.name), Age: \(s.age)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、要素が Student オブジェクトの name 順にソートされているのがわかります。&lt;br&gt;&lt;br&gt;Name: Sato, Age: 8&lt;br&gt;Name: Suzuki, Age: 9&lt;br&gt;Name: Tanaka, Age: 10&lt;br&gt;Name: Tanaka, Age: 11&lt;br&gt;Name: Yamada, Age: 10&lt;br&gt;降順にしたい時は students.sort(by: {$0.name &gt; $1.name}) のように不等号の向きを反対にするか、students.sort(by: {$1.name &lt; $0.name}) のように $0 と $1 を入れ替えれば降順になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;この配列を名前順に加えて、年齢の降順にソートしたい時には、やり方は何通りかありますが、タプルを使って次のようにすることができます。&lt;br&gt;&lt;br&gt;struct Student {&lt;br&gt;    var name: String&lt;br&gt;    var age: Int&lt;br&gt;}&lt;br&gt;&lt;br&gt;var students = [&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Suzuki&quot;, age: 9),&lt;br&gt;    Student(name: &quot;Sato&quot;, age: 8),&lt;br&gt;    Student(name: &quot;Yamada&quot;, age: 10),&lt;br&gt;    Student(name: &quot;Tanaka&quot;, age: 11)&lt;br&gt;]&lt;br&gt;&lt;br&gt;students.sort(by: {&lt;br&gt;    ($0.name, $1.age) &lt; ($1.name, $0.age)&lt;br&gt;})&lt;br&gt;&lt;br&gt;for s in students {&lt;br&gt;    print(&quot;Name: \(s.name), Age: \(s.age)&quot;)&lt;br&gt;}&lt;br&gt;実行結果は次のようになり、要素が Student オブジェクトの name 昇順、age 降順にソートされました。&lt;br&gt;&lt;br&gt;Name: Sato, Age: 8&lt;br&gt;Name: Suzuki, Age: 9&lt;br&gt;Name: Tanaka, Age: 11&lt;br&gt;Name: Tanaka, Age: 10&lt;br&gt;Name: Yamada, Age: 10&lt;br&gt;Swift の Array（配列）- 要素の並べ替え 1&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;sorted() で要素が並び替えられた Array（配列）を取得する&lt;br&gt;sort() メソッドを使うと、 Array（配列）内の要素の並び順を変更することができました。&lt;br&gt;&lt;br&gt;その変更は永久的なもので、並べ替えてしまうと、元の並び順がどうだったかはもうわかりません。&lt;br&gt;&lt;br&gt;時には、元の Array はそのままで、並び順が変わった Array を取得したいことがあるかもしれません。&lt;br&gt;&lt;br&gt;そんな時は、sorted() メソッドを使うことで、要素が並び替えられた新しい Array を取得することができます。&lt;br&gt;&lt;br&gt;vvar names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;var names_sorted = names.sorted()&lt;br&gt;names_sorted[0] = &quot;Saito1&quot;&lt;br&gt;&lt;br&gt;print(names)&lt;br&gt;print(names_sorted)&lt;br&gt;実行結果は次のようになり、names_sorted に要素が並べ替えられた Array がコピーされていて、names_sorted を変更しても、names には影響を与えていませんね。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Saito1&quot;, &quot;Suzuki&quot;, &quot;Tanaka&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;reverse() メソッドで要素の並び順を反対にする&lt;br&gt;Swift の Array（配列）の要素の並び順を単純に今の反対にしたい時は reverse() メソッドを使います。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.reverse()&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、要素の順番が反対になっていますね。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Yamada&quot;, &quot;Sato&quot;, &quot;Suzuki&quot;, &quot;Tanaka&quot;]&lt;br&gt;sort() と sorted() のように reverse() にも reversed() があり、並び順を逆にした配列をコピーしたい時は reversed() が使えます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Array（配列）の要素を並べ替える方法についてご説明しました。</description><pubDate>Wed, 07 Oct 2020 00:36:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Array（配列）- 要素数と値の出現位置</title><link>https://softmoco.com/swift-basics/swift-array-inspect.php</link><description>Swift の Array（配列）- 要素数と値の出現位置&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Array（配列）の要素数と値の出現位置を取得する方法などについてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;count プロパティで Array（配列）の要素の数を取得する&lt;br&gt;isEmpty プロパティで Array（配列）が空かどうか確認する&lt;br&gt;firstIndex()・lastIndex() メソッドで値が出現する位置を取得する&lt;br&gt;&lt;br&gt; &lt;br&gt;count プロパティで Array（配列）の要素の数を取得する&lt;br&gt;Swift の Array（配列）の中の要素の数を取得したい時には Array の count プロパティを使います。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names.count)&lt;br&gt;実行結果は次のようになり、4つの要素があるので 4 と出力されています。&lt;br&gt;&lt;br&gt;4&lt;br&gt;&lt;br&gt;isEmpty プロパティで Array（配列）が空かどうか確認する&lt;br&gt;Swift で Array（配列）の要素が空っぽかどうかを確認するには、isEmpty プロパティが使えます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names.isEmpty)&lt;br&gt;&lt;br&gt;names.removeAll()&lt;br&gt;print(names.isEmpty)&lt;br&gt;実行結果です。removeAll() メソッドで、配列を空っぽにすると names.isEmpty が true になりました。&lt;br&gt;&lt;br&gt;false&lt;br&gt;true&lt;br&gt;&lt;br&gt;firstIndex()・lastIndex() メソッドで値が出現する位置を取得する&lt;br&gt;Swift で Array（配列）の中で指定した値が最初に出現するインデックスを取得するには、firstIndex() メソッドが使えます。&lt;br&gt;&lt;br&gt;指定した値が存在しない時は nil が返ります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、次のような names 配列の中で &quot;Sato&quot; や &quot;Yamamoto&quot; の最初の出現位置のインデックスを取得したい時は次のようにできます。&lt;br&gt;&lt;br&gt;?? を使って nil の時のデフォルト値に &quot;Not Found&quot; を指定しています。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;, &quot;Sato&quot;]&lt;br&gt;&lt;br&gt;print(names.firstIndex(of: &quot;Sato&quot;) ?? &quot;Not Found&quot;)&lt;br&gt;print(names.firstIndex(of: &quot;Yamamoto&quot;) ?? &quot;Not Found&quot;)&lt;br&gt;実行結果は次のようになり、Sato が最初に出現するインデックスは 2 で、Yamamoto は存在しないので Not Found が出力されます。&lt;br&gt;&lt;br&gt;2&lt;br&gt;Not Found&lt;br&gt;&lt;br&gt;同じような感じで、Array（配列）の中で指定した値が最後に出現するインデックスを取得するには、lastIndex() メソッドが使えます。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;, &quot;Sato&quot;]&lt;br&gt;&lt;br&gt;print(names.lastIndex(of: &quot;Sato&quot;) ?? &quot;Not Found&quot;)&lt;br&gt;print(names.lastIndex(of: &quot;Yamamoto&quot;) ?? &quot;Not Found&quot;)&lt;br&gt;実行結果は次のようになり、Sato が最後に出現するインデックスは 4 で、Yamamoto は存在しないので Not Found が出力されます。&lt;br&gt;&lt;br&gt;4&lt;br&gt;Not Found&lt;br&gt;&lt;br&gt;以上、Swift の Array（配列）の要素数と値の出現位置を取得する方法などについてご説明しました。</description><pubDate>Wed, 07 Oct 2020 00:35:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Array（配列）- 要素の削除</title><link>https://softmoco.com/swift-basics/swift-array-remove.php</link><description>Swift の Array（配列）- 要素の削除&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Array（配列）から要素を削除する方法についてご説明します。&lt;br&gt;&lt;br&gt;Swift の Array（配列）から要素を削除するには、何個か方法があります。&lt;br&gt;&lt;br&gt;それぞれの方法を、実際にコードを実行しながら見ていきましょう。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;remove() で Array（配列）からインデックスを指定して要素を削除する&lt;br&gt;removeSubrange() でインデックスの範囲を指定して要素を削除する&lt;br&gt;removeFirst() で Array の最初の要素を削除する&lt;br&gt;removeLast() で Array の最後の要素を削除する&lt;br&gt;removeAll() で Array の全ての要素を削除する&lt;br&gt;removeAll(where:) で配列から値を指定して要素を削除する&lt;br&gt;remove() で Array（配列）からインデックスを指定して要素を削除する&lt;br&gt;Swift の Array（配列）で、削除したい要素のインデックスがわかっている場合は remove() メソッドを使って要素を削除することができます。&lt;br&gt;&lt;br&gt;使い方は Array.remove(at: index) のように index を指定します。&lt;br&gt;&lt;br&gt;remove() は削除した要素を返すので、削除された要素が必要な時は戻り値を変数に代入するなどして使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、Array（配列）から 2 つ目の要素を remove() メソッドを使って削除してみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift のインデックスは 1 からではなく、0 から始まるので、2 つ目の要素のインデックスは 1 です。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;let removed = names.remove(at: 1)&lt;br&gt;print(names)&lt;br&gt;print(removed)&lt;br&gt;実行結果は次のようになり、 2 番目の Suzuki が names 配列から削除されて、removed に取得できています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;Suzuki&lt;br&gt;&lt;br&gt;removeSubrange() でインデックスの範囲を指定して要素を削除する&lt;br&gt;Swift の範囲演算子 を使って、Array（配列）から、removeSubrange() メソッドにインデックスの範囲を指定して要素を削除することができます。&lt;br&gt;&lt;br&gt;例えば、先ほどの Array の  2 番目と 3 番目（インデックスが 1 から 2 ）の要素を削除したいのであれば次のようにできます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.removeSubrange(1...2)&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、 2 番目と 3 番目の要素が削除されています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;removeFirst() で Array の最初の要素を削除する&lt;br&gt;Swift の Array（配列）の最初の要素を削除したい時には removeFirst() メソッドを使います。&lt;br&gt;&lt;br&gt;removeFirst() を引数なしで使った時には、一番最初の要素を削除して、戻り値として削除した要素を返します。&lt;br&gt;&lt;br&gt;removeFirst(削除する要素数) のように、引数に削除する要素数を指定すると、一番最初から指定した数の要素を削除し、この場合は戻り値はありません。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、removeFirst() を使って要素を削除してみましょう。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;let removed = names.removeFirst()&lt;br&gt;print(names)&lt;br&gt;print(removed)&lt;br&gt;実行結果は次のようになり、 names からは一番最初の Tanaka が削除され、removed という変数に削除された要素が取得できているのがわかります。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;Tanaka&lt;br&gt;&lt;br&gt;また、前から 2 個、要素を削除したいのであれば、次のようにできます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.removeFirst(2)&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;実行結果は次のようになり、 names 配列の前から二つの要素が削除されています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt; &lt;br&gt;removeLast() で Array の最後の要素を削除する&lt;br&gt;Swift の Array（配列）の最後の要素を削除したい時には removeLast() メソッドを使います。&lt;br&gt;&lt;br&gt;removeFirst() と最初と最後が違うだけでほぼ同じで、removeLast() を引数なしで使った時には、一番最後の要素を削除して、戻り値として削除した要素を返します。&lt;br&gt;&lt;br&gt;removeLast(削除する要素数) のように、引数に削除する要素数を指定すると、一番最後から指定した数の要素を削除し、この場合は戻り値はありません。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、removeLast() を使って要素を削除してみましょう。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;let removed = names.removeLast()&lt;br&gt;print(names)&lt;br&gt;print(removed)&lt;br&gt;実行結果は次のようになり、names からは一番最後の Yamada が削除され、removed という変数に削除された要素が取得できているのがわかります。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;]&lt;br&gt;Yamada&lt;br&gt;&lt;br&gt;また、後ろから 2 個、要素を削除したいのであれば、次のようにできます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.removeLast(2)&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、 names 配列の後ろから二つの要素が削除されています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;]&lt;br&gt;&lt;br&gt;removeAll() で Array の全ての要素を削除する&lt;br&gt;Swift の Array（配列）の全ての要素を削除したい時には removeAll() メソッドを使います。&lt;br&gt;&lt;br&gt;removeAll() を使って全ての要素を削除してみます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.removeAll()&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、全ての要素が削除されているのがわかります。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[]&lt;br&gt;&lt;br&gt;removeAll(where:) で配列から値を指定して要素を削除する&lt;br&gt;removeAll(where:) メソッドを使って、削除したい値を指定して、配列からその値の要素を全て削除することができます。&lt;br&gt;&lt;br&gt;例えば、[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;, &quot;Suzuki&quot;] という配列から &quot;Suzuki&quot; を削除したいのであれば次のように指定できます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;, &quot;Suzuki&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.removeAll(where: {$0 == &quot;Suzuki&quot;})&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、&quot;Suzuki&quot; の要素が全て削除されています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;, &quot;Suzuki&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;Swift の Array（配列）- 要素の削除 1&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の Array（配列）から要素を削除する方法についてご説明しました。&lt;br&gt;</description><pubDate>Wed, 07 Oct 2020 00:33:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Array（配列）- 要素の変更・追加</title><link>https://softmoco.com/swift-basics/swift-array-modify-add.php</link><description>Swift の Array（配列）- 要素の変更・追加&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは Swift の Array（配列）について基本的なことと、配列の要素の変更と追加の方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の Array（配列）の基本&lt;br&gt;Swift の Array（配列）要素にアクセスする&lt;br&gt;範囲指定で Array（配列）要素にアクセスする&lt;br&gt;Swift の Array（配列）の値を変更する&lt;br&gt;append() メソッドで Array（配列）に要素を追加する&lt;br&gt;append() メソッドで Array を結合する&lt;br&gt;insert() メソッドで Array（配列）に要素を追加する&lt;br&gt;Swift の Array（配列）の基本&lt;br&gt;Swift の Array（配列）は順序を意識した、複数の値の集合です。&lt;br&gt;&lt;br&gt;それぞれの値は文字列でも数字でもいいですし、クラスのオブジェクトを格納することもできます。&lt;br&gt;&lt;br&gt;Set（セット）とは違って、配列内の値はユニークである必要はなく、同じ値が違うインデックスに存在していても大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift で Array（配列）を作りたい時は、[データ型] のようにデータ型を指定します。&lt;br&gt;&lt;br&gt;例えば、names という文字列の Array を作って、空に初期化したい時は、次のようにできます。&lt;br&gt;&lt;br&gt;var names: [String] = []&lt;br&gt;&lt;br&gt;以下のように作っても同じ意味ですが、Swift の公式ドキュメントでは [データ型] のほうが推奨されています。&lt;br&gt;&lt;br&gt;var names: Array&lt;String&gt; = Array()&lt;br&gt;&lt;br&gt;その他の変数の定義と同様で、次のようにデータ型を指定せずに値をいきなりアサインして Array を定義することもできます。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;Array を変更する必要がない時は var ではなくて let で定義します。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;それでは、Swift の Array を使っていきましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Array（配列）要素にアクセスする&lt;br&gt;Swift の Array（配列）の中のひとつひとつのデータのことは要素といい、インデックスを指定することによって、各要素にアクセスすることができます。&lt;br&gt;&lt;br&gt;Swift のインデックスは 1 からではなく、0 から始まります。 1 番最初が 0、2 番目が 1、3 番目が 2、、となります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、ひとつ目と 3 つ目の要素を取得したい時は次のようにします。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;print(names[0])&lt;br&gt;print(names[2])&lt;br&gt;実行結果は次のようになります。&lt;br&gt;&lt;br&gt;Tanaka&lt;br&gt;Sato&lt;br&gt;&lt;br&gt;範囲指定で Array（配列）要素にアクセスする&lt;br&gt;Swift の範囲演算子 を使って、Array[範囲演算子]のように範囲を指定して、Array（配列）を要素を取得することができます。&lt;br&gt;&lt;br&gt;実際に試してみましょう。&lt;br&gt;&lt;br&gt;let names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;print(names[1...2])&lt;br&gt;print(names[2...])&lt;br&gt;print(names[...2])&lt;br&gt;print(names[..&lt;2])&lt;br&gt;指定した範囲演算子は次のような意味です。&lt;br&gt;&lt;br&gt;1...2 はインデックスが 1 から 2 まで&lt;br&gt;2... はインデックスが 2 から残り全部&lt;br&gt;...2 はインデックスが一番最初から 2 まで&lt;br&gt;..&lt;2 はインデックスが一番最初から 1 まで&lt;br&gt;&lt;br&gt;実行結果は次のようになり、それぞれ上でご説明した通りのインデックスの要素を持つ Array（配列）が出力されていますね。&lt;br&gt;&lt;br&gt;[&quot;Suzuki&quot;, &quot;Sato&quot;]&lt;br&gt;[&quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;]&lt;br&gt;Swift の Array（配列）- 要素の変更・追加 2&lt;br&gt;&lt;br&gt; let names2 = names[1...2] とした場合、この names2 は ArraySlice といい、元の Array へのポインターのようなものになります。ですのでインデックスでアクセスする時は元の配列のままになります。上の例の場合だと、names2[1] が &quot;Suzuki&quot; で、names2[0] にアクセスしようとするとエラーになります。ArraySlice ではなくて、指定した範囲の要素を持つ新しい Array を作りたい時は、let names2 = Array(names[1...2]) のようにすると、指定した範囲の要素を持つ Array になり、インデックスも 0 からふりなおされます。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の Array（配列）の値を変更する&lt;br&gt;Swift の Array（配列）の値を変更するには、インデックスを指定してその要素に新しい値を代入します。&lt;br&gt;&lt;br&gt;例えば、 2 番目の要素を &quot;Yamamoto&quot; に変更したい時は次のようにします。&lt;br&gt;&lt;br&gt;Array を変更するので、変数の定義の箇所を let から var に変えています。&lt;br&gt;&lt;br&gt;var names = [&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names[1] = &quot;Yamamoto&quot;&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、2 番目が &quot;Yamamoto&quot; に変更されていますね。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Yamamoto&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;Swift の Array（配列）- 要素の変更・追加 1&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;append() メソッドで Array（配列）に要素を追加する&lt;br&gt;Swift の Array（配列）に要素を追加するには、 Array（配列）の一番最後に追加する方法と、インデックスを指定して、その場所に追加する方法があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;Array（配列）の一番最後に追加するには append() というメソッドを使います。&lt;br&gt;&lt;br&gt;空っぽの Array（配列）を定義して、append() を使って要素を三つ追加してみます。&lt;br&gt;&lt;br&gt;var names: [String] = []&lt;br&gt;&lt;br&gt;names.append(&quot;Tanaka&quot;)&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.append(&quot;Suzuki&quot;)&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.append(&quot;Sato&quot;)&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、値が順番に Array（配列）の一番後ろに追加されていっています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;]&lt;br&gt;&lt;br&gt;append() メソッドで Array を結合する&lt;br&gt;append() メソッドで Array（配列）の一番後ろに、別の Array の要素を追加することもできます。&lt;br&gt;&lt;br&gt;その時は append(contentsOf: 別のArray) のように使います。&lt;br&gt;&lt;br&gt;例えば、name2 という別の配列を定義、name に name2 の要素を追加したい時は次のようにできます。&lt;br&gt;&lt;br&gt;var names: [String] = []&lt;br&gt;var names2 = [&quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;names.append(&quot;Tanaka&quot;)&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.append(contentsOf: names2)&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、names2 の要素が追加されています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;insert() メソッドで Array（配列）に要素を追加する&lt;br&gt;Swift の Array（配列）にインデックスを指定して、その場所に要素を追加するには、insert() という名前のメソッドを使います。&lt;br&gt;&lt;br&gt;insert([追加したい値], at: [追加したい位置]) のように指定します。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、2 番目に新しい値を挿入したい場合は次のようにします。&lt;br&gt;&lt;br&gt;var names = [ &quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;print(names)&lt;br&gt;&lt;br&gt;names.insert(&quot;Ishikawa&quot;, at: 1)&lt;br&gt;print(names)&lt;br&gt;実行結果は次のようになり、2 番目に &quot;Ishikawa&quot; が挿入されて、残りの要素は後ろにずれています。&lt;br&gt;&lt;br&gt;[&quot;Tanaka&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;[&quot;Tanaka&quot;, &quot;Ishikawa&quot;, &quot;Suzuki&quot;, &quot;Sato&quot;, &quot;Yamada&quot;]&lt;br&gt;&lt;br&gt;以上、Swift の Array（配列）の基本と、要素の変更と追加の方法についてご説明しました。&lt;br&gt;</description><pubDate>Wed, 07 Oct 2020 00:27:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift の Array（配列）</title><link>https://softmoco.com/swift-basics/swift-array.php</link><description>Swift には、複数の値の集合を格納する主要なデータ型に、Array（配列）、Set（セット）、Dictionay（辞書）があります。&lt;br&gt;&lt;br&gt;ここでは基本的な Swift の Array（配列）の使い方についてご説明します。&lt;br&gt;&lt;br&gt;Swift の Array（配列）- 要素の変更・追加&lt;br&gt;Swift の Array（配列）の基本&lt;br&gt;Swift の Array（配列）要素にアクセスする&lt;br&gt;範囲指定で Array（配列）要素にアクセスする&lt;br&gt;Swift の Array（配列）の値を変更する&lt;br&gt;append() メソッドで Array（配列）に要素を追加する&lt;br&gt;append() メソッドで Array を結合する&lt;br&gt;insert() メソッドで Array（配列）に要素を追加する&lt;br&gt;Swift の Array（配列）- 要素の削除&lt;br&gt;remove() で Array（配列）からインデックスを指定して要素を削除する&lt;br&gt;removeSubrange() でインデックスの範囲を指定して要素を削除する&lt;br&gt;removeFirst() で Array の最初の要素を削除する&lt;br&gt;removeLast() で Array の最後の要素を削除する&lt;br&gt;removeAll() で Array の全ての要素を削除する&lt;br&gt;removeAll(where:) で配列から値を指定して要素を削除する&lt;br&gt;Swift の Array（配列）- 要素数と値の出現位置&lt;br&gt;count プロパティで Array（配列）の要素の数を取得する&lt;br&gt;isEmpty プロパティで Array（配列）が空かどうか確認する&lt;br&gt;firstIndex()・lastIndex() メソッドで値が出現する位置を取得する&lt;br&gt;Swift の Array（配列）- 要素の並べ替え&lt;br&gt;sort() で Array（配列）の要素を並べ替える&lt;br&gt;sort() で 配列の構造体やクラスオブジェクトの要素を並べ替える&lt;br&gt;sorted() で要素が並び替えられた Array（配列）を取得する&lt;br&gt;reverse() で要素の並び順を反対にする&lt;br&gt;Swift の Array（配列）- ループ・map・filter&lt;br&gt;Swift の Array（配列）をループする&lt;br&gt;map() で要素を変換した配列を生成する&lt;br&gt;filter() で要素をフィルターした配列を生成する</description><pubDate>Wed, 07 Oct 2020 00:26:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>Swift でどの configuration で実行されているかを特定する方法</title><link>https://softmoco.com/devenv/how-to-determine-which-configuration-in-swift.php</link><description>Swift でどの configuration で実行されているかを特定する方法 - #if DEBUG とは？&lt;br&gt;&lt;br&gt; &lt;br&gt;「Xcode で環境ごとの設定を管理する方法」では、開発、QA、本番環境用に build configration と schema を作って、環境ごとの設定ができるようにしました。&lt;br&gt;&lt;br&gt;アプリの実行時に、どの build configration を選択して実行されているかを特定して、それによって違う処理をしたい時があるかもしれません。&lt;br&gt;&lt;br&gt;ここでは、Swift で、どの configuration で実行されているかを特定する方法をご説明します。&lt;br&gt;&lt;br&gt;Build Configuration と Scheme は追加済の前提ですすめますので、まだの方は「Xcode で環境ごとの設定を管理する方法」の目次に戻って追加・設定してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift でどの configuration で実行されているかを特定する方法&lt;br&gt;Swift でデバッグモードかどうかを確認する時に、次のようなコードを見たことがあるかもしれません。&lt;br&gt;&lt;br&gt;#if DEBUG&lt;br&gt;[コードブロック A]&lt;br&gt;#else&lt;br&gt;[コードブロック B]&lt;br&gt;#endif&lt;br&gt;これは、conditional compilation block というもので、この部分はコンパイル時に指定した compilation condition オプションによって評価されて true の部分がコンパイルされて実行されます。&lt;br&gt;&lt;br&gt;ですので、上のコードは compilation condition オプションが DEBUG の時は [コードブロック A] が、そうでない時は [コードブロック B] がコンパイルされて実行されるということになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;この compilation condition オプション使って、実行時に選択された build configration が特定することができます。&lt;br&gt;&lt;br&gt;以下のように TARGET のプロジェクト名をクリックし、Build Settings タブで Active Compilation Condition で検索してみてください。&lt;br&gt;&lt;br&gt;Swift で、どの configuration で実行されているかを特定する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Debug とつく configuration は、プロジェクトが新規作成された時の Debug configtaion を複製して作ったので、Combined で見たら、Project の Build Settings のデフォルトの設定を継承して DEBUG と入っていると思います。&lt;br&gt;&lt;br&gt;ここで build configuration ごとの compilation condition が設定でき、#if DEBUG の DEBUG はここからきています。&lt;br&gt;&lt;br&gt;DEBUG 用の configutaion かどうかだけを特定したいだけであればこのままでいいですね。&lt;br&gt;&lt;br&gt;&lt;br&gt;Debug、Release を問わず環境 (scheme) を特定したいのであれば、次のような感じで設定しても良いと思います。&lt;br&gt;&lt;br&gt;Swift で、どの configuration で実行されているかを特定する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift のコード側は、例えば label という名前の UILabel のアウトレットの text にコンパイル時に選択された環境 (scheme) を表示したいのであれば、次のようにすることができます。&lt;br&gt;&lt;br&gt;#if DEV&lt;br&gt;label.text = &quot;Development&quot;&lt;br&gt;#elseif QA&lt;br&gt;label.text = &quot;QA&quot;&lt;br&gt;#else&lt;br&gt;label.text = &quot;Production&quot;&lt;br&gt;#endif&lt;br&gt;&lt;br&gt;もちろん、それぞれの環境 Debug、Release で全て違う値を設定して、選択された configuration を特定することもできますし、compilation condition オプションを複数設定することもできます。&lt;br&gt;&lt;br&gt;例えば、環境ごとに加えて、Debug・Release でも別のコードを実行したいのであれば、次のようにできます。&lt;br&gt;&lt;br&gt;Swift で、どの configuration で実行されているかを特定する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;この場合は以下のような感じで compilation condition に応じて、それぞれ違うコードを実行できます。&lt;br&gt;&lt;br&gt;#if DEV&lt;br&gt;...&lt;br&gt;#elseif QA&lt;br&gt;...&lt;br&gt;#else&lt;br&gt;...&lt;br&gt;#endif&lt;br&gt;&lt;br&gt;#if Debug&lt;br&gt;...&lt;br&gt;#else&lt;br&gt;...&lt;br&gt;#endif&lt;br&gt;&lt;br&gt;以上、Swift で、どの configuration で実行されているかを特定する方法をご説明しました。</description><pubDate>Mon, 05 Oct 2020 18:10:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法</title><link>https://softmoco.com/devenv/how-to-create-and-setup-xcconfig-file.php</link><description>Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;システム開発をしていると、プログラムを QA 環境や本番環境にデプロイする際に、環境に応じて違う設定を使いたいことがあるかと思います。&lt;br&gt;&lt;br&gt;ここでは、Xcode で環境ごとの設定をするために xcconfig ファイルを生成して設定する方法をご説明します。&lt;br&gt;&lt;br&gt;Build Configuration と Scheme は追加済の前提ですすめますので、まだの方は「Xcode で環境ごとの設定を管理する方法」の目次に戻って追加・設定してください。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Xcode で xcconfig ファイルを生成する&lt;br&gt;xcconfig ファイルを configurations に設定する&lt;br&gt;xcconfig ファイルに値を追加して設定する&lt;br&gt;xcconfig ファイルの値を Swift のコードで取得する&lt;br&gt;Xcode で xcconfig ファイルを生成する&lt;br&gt;次は Configuration Settings 用の xcconfig ファイルを作って、環境ごとの値を設定してみましょう。&lt;br&gt;&lt;br&gt;開発、QA、本番環境用の xcconfig ファイルを生成します。&lt;br&gt;&lt;br&gt;&lt;br&gt;メニューバーの File &gt; New &gt; File... で iOS の Configuration Settings File を選択し Next をクリックして、Development.xcconfig ファイルを生成します。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 20&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 21&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 22&lt;br&gt;&lt;br&gt;&lt;br&gt;同様に、QA.xcconfig、Production.xcconfig ファイルも生成してください。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 23&lt;br&gt;&lt;br&gt;&lt;br&gt;xcconfig ファイルを configurations に設定する&lt;br&gt;次に、生成した xcconfig ファイルと configuration を紐付けます。&lt;br&gt;&lt;br&gt;PROJECT のプロジェクト名をクリックし、Info タブの Configurations のそれぞれの configuration を開き Target の [Based on Configration File] を以下のように設定します。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 24&lt;br&gt;&lt;br&gt;これで、build schema を変更して実行をすると、schema で設定した build configuration の config ファイルが使われるようになります。&lt;br&gt;&lt;br&gt;ただ、ビルド設定の優先順位があるので、xcconfig ファイルに書いたからと言って、単純にその値が使われるわけではありません。&lt;br&gt;&lt;br&gt;詳しくは「Xcode の ビルド設定の優先順位」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;xcconfig ファイルに値を追加して設定する&lt;br&gt;「Xcode の Project エディタで環境ごとのビルド設定をする」では、Project エディタの Target の Build Settings で、環境に応じた Bundle ID を設定しました。&lt;br&gt;&lt;br&gt;ここでは、開発、QA、本番の環境ごとに別のアプリ名を xcconfig ファイルを使って設定してみます。&lt;br&gt;&lt;br&gt;&lt;br&gt;xcconfig ファイルに書く時は、基本的には次のようなフォーマットで設定します。&lt;br&gt;&lt;br&gt;BUILD_SETTING_KEY = BUILD_SETTING_VALUE&lt;br&gt;既に定義されているビルド設定を上書きすることもできますし、新しいビルド設定キーを定義して値を設定することもできます。&lt;br&gt;&lt;br&gt;ただ、既に定義されているビルド設定を上書きする場合、Target の Build Settings のほうが優先順位が高いので、Target の Build Settings で値が設定されている場合はそちらが優先され、ここに書くだけでは上書きされません。&lt;br&gt;&lt;br&gt;&lt;br&gt;info.plist や Project エディタで $( ) で囲まれているのがビルド設定のキー名です。&lt;br&gt;&lt;br&gt;例えば、Bundle dispaly name や Bundle name には $(PRODUCT_NAME) が設定されていて、PRODUCT_NAME がキー名です。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 25&lt;br&gt;&lt;br&gt; ビルド設定のキー名がわからない時は、アシスタントエディタで、Build Settings から xcconfig ファイルにドラッグ＆ドロップすることでも確認できます。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 26&lt;br&gt;&lt;br&gt;&lt;br&gt;PRODUCT_NAME を xcconfig ファイルで設定するのであれば、次のようにできますが、Target の Build Settings で PRODUCT_NAME に $(TARGET_NAME) が設定されているので、そちらが優先されてしまいます。&lt;br&gt;&lt;br&gt;PRODUCT_NAME = TestApp Dev&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 27&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は新しい APP_NAME というキーを作って、info.plist の Bundle dispaly name と Bundle name を置き換えてしまうことにします。&lt;br&gt;&lt;br&gt;Development.xcconfig、QA.xcconfig、Production.xcconfig にそれぞれ次の値を設定します。&lt;br&gt;&lt;br&gt;APP_NAME = TestApp Dev&lt;br&gt;APP_NAME = TestApp QA&lt;br&gt;APP_NAME = TestApp&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 28&lt;br&gt;&lt;br&gt;&lt;br&gt;そして、info.plist の Bundle dispaly name と Bundle name を $(APP_NAME) に変更します。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 29&lt;br&gt;&lt;br&gt;&lt;br&gt;この状態でスキームを変更してシミュレーターで実行すると、前回 Bundle ID も違うものを設定しているので、環境ごとに違うアプリの名前でインストールされると思います。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 30&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 31&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 32&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 33&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;xcconfig ファイルの値を Swift のコードで取得する&lt;br&gt;API の URL など、Swift のコードから、xcconfig ファイルの値を取得したいことがあるかもしれません。&lt;br&gt;&lt;br&gt;そんな時は xcconfig ファイルで作った ビルド設定のキーを info.plist に追加しておくことで取得可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、次のような API_URL というビルド設定を定義します。&lt;br&gt;&lt;br&gt;Development.xcconfig、QA.xcconfig、Production.xcconfig にそれぞれ次の値を追加します。&lt;br&gt;&lt;br&gt;API_URL = www.softmoco.com/api-dev&lt;br&gt;API_URL = www.softmoco.com/api-qa&lt;br&gt;API_URL = www.softmoco.com/api&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 34&lt;br&gt;&lt;br&gt; https:// も含めたい時は、// 以降はコメントとみなされてしまうので、$() を入れて https:/$()/www.softmoco.com とするなどしてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;info.plist に API URL という行を追加して、$(API_URL) を設定します。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 35&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 36&lt;br&gt;&lt;br&gt;&lt;br&gt;後は、他の info.plist の値を取得したい時と同じで、次のような感じで取得できます。&lt;br&gt;&lt;br&gt;let apiURL = Bundle.main.object(forInfoDictionaryKey: &quot;API URL&quot;) as? String&lt;br&gt;&lt;br&gt;テストのために、Label をおいて、apiURL の値を表示してみました。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 37&lt;br&gt;&lt;br&gt;class ViewController: UIViewController {&lt;br&gt;    &lt;br&gt;    @IBOutlet weak var apiURLLabel: UILabel!&lt;br&gt;    &lt;br&gt;    override func viewDidLoad() {&lt;br&gt;        super.viewDidLoad()&lt;br&gt;        &lt;br&gt;        if let apiURL = Bundle.main.object(forInfoDictionaryKey: &quot;API URL&quot;) as? String {&lt;br&gt;            apiURLLabel.text = &quot;https://\(apiURL)&quot;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;この状態でスキームを変更してシミュレーターで実行すると、環境に応じた URL が取得できていることがわかります。&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 30&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 38&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 32&lt;br&gt;&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法 39&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode で環境ごとの設定をするために xcconfig ファイルを生成して設定する方法をご説明しました。</description><pubDate>Fri, 02 Oct 2020 04:53:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Xcode の Project エディタで環境ごとのビルド設定をする方法</title><link>https://softmoco.com/devenv/how-to-setup-build-settings-for-multiple-environment-in-project-editor.php</link><description>Xcode の Project エディタで環境ごとのビルド設定をする方法&lt;br&gt;&lt;br&gt; &lt;br&gt;システム開発をしていると、プログラムを QA 環境や本番環境にデプロイする際に、環境に応じて違う設定を使いたいことがありますよね。&lt;br&gt;&lt;br&gt;ここでは、Xcode の Project エディタで環境ごとのビルド設定をする方法をご説明します。&lt;br&gt;&lt;br&gt;Build Configuration と Scheme は追加済の前提ですすめますので、まだの方は「Xcode で環境ごとの設定を管理する方法」の目次に戻って追加・設定してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Xcode の ビルド設定の優先順位&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする&lt;br&gt;&lt;br&gt;Xcode の ビルド設定の優先順位&lt;br&gt;Xcode でビルドする際、複数箇所にビルドの設定をすることができるので、値が使われる優先順位が決まっています。&lt;br&gt;&lt;br&gt;優先順位は高い順で次のようになっています。&lt;br&gt;&lt;br&gt;Target レベルの Build Settings&lt;br&gt;Target にマップされた config ファイル&lt;br&gt;Project レベルの Build Settings&lt;br&gt;Project にマップされた config ファイル&lt;br&gt;プラットフォームのデフォルト&lt;br&gt;後ほど、環境ごとの Target レベルのビルド設定をする方法と、config ファイルによる値の設定の方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;最終的にどの設定の値が有効になるかは、プロジェクトエディタの以下の場所で確認できます。&lt;br&gt;&lt;br&gt;ここで Resolved に表示されている値が、最終的にこのビルド設定のキーに対応して使われる値です。&lt;br&gt;&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする方法 17&lt;br&gt;&lt;br&gt;&lt;br&gt;また、すこしややこしいですが、ここで設定されていても、そのビルド設定が最終的に使われているかどうかは別の話になります。&lt;br&gt;&lt;br&gt;例えば、ここで Target レベルの Build Settings の Product Bundle Identifer が設定されていても、info.plist で Bundle identifier の値が $(PRODUCT_BUNDLE_IDENTIFIER) から他のものに変更されている時はそちらが使われます。&lt;br&gt;&lt;br&gt;あくまでも PRODUCT_BUNDLE_IDENTIFIER というキーにたいして、Resolved の値が使われる、という感じです。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする&lt;br&gt;では、Project エディタで Target レベルで環境ごとの値を設定してみましょう。&lt;br&gt;&lt;br&gt;例えば、Bundle ID を環境ごとに違う値を設定してみます。&lt;br&gt;&lt;br&gt;&lt;br&gt;プロジェクトエディタで PROJECT のプロジェクト名をクリックし、Build Settings タブを選択し Bundle で検索します。&lt;br&gt;&lt;br&gt;Project Bundle Identifer の左側をクリックすると Build Configuration ごとの値が出てきます。&lt;br&gt;&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする方法 18&lt;br&gt;&lt;br&gt;&lt;br&gt;Development 環境用の configuration の Bundle ID には .dev を、QA 環境用の configuration には .qa を後ろに追加しました。&lt;br&gt;&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする方法 19&lt;br&gt;&lt;br&gt;これで、info.plist は変更されていない前提で、build schema を変更して実行をすると、環境ごとに違う Bundle ID が使われ、同じデバイスに環境ごとのアプリをインストールできるようになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode の Project エディタで環境ごとのビルド設定をする方法をご説明しました。</description><pubDate>Fri, 02 Oct 2020 04:52:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Xcode で Build Scheme を生成して設定する方法</title><link>https://softmoco.com/devenv/how-to-create-and-setup-build-scheme.php</link><description>Xcode で Build Scheme を生成して設定する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;システム開発をしていると、プログラムを QA 環境や本番環境にデプロイする際に、環境に応じて違う設定を使いたいことがあるかと思います。&lt;br&gt;&lt;br&gt;ここでは、Xcode で環境ごとの設定をするために Build Scheme を生成して設定する方法をご説明します。&lt;br&gt;&lt;br&gt;Build Configuration は追加済の前提ですすめますので、まだの方は「Xcode で環境ごとの設定を管理する方法」の目次に戻って追加してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する&lt;br&gt;Build scheme とは、ビルドするターゲットや、ビルドする時の configuration やオプションなどを定義したものです。&lt;br&gt;&lt;br&gt;環境ごとに build scheme を作っておき、Run や Archive する際にスキーマを選んで実行します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、Xcode で環境ごとの build scheme を設定していきます。&lt;br&gt;&lt;br&gt;実行・停止ボタンの右側に scheme を選択する箇所があるので、そこをクリックし、[Manage Schemes...] を選択します。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 8&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で新規プロジェクを作成すると、デフォルトでプロジェクト名の scheme がひとつできていると思います。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;スキームの名前を Development に変更して、選択した状態で [Edit] ボタンをクリックします。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;左側で、Run、Test、Profile、Analyze、Archive と順番に選択していくと、それぞれ Build Configuration に Development の Debug、Debug、Relase、Debug、Relase configuration が設定されていると思います。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;これと同じような scheme を QA と Producdtion 用にも作ります。&lt;br&gt;&lt;br&gt;[Duplicate Scheme] ボタンをクリックして、名前を QA に変更します。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 13&lt;br&gt;&lt;br&gt;&lt;br&gt;Run、Test、Profile、Analyze、Archive の Build Configuration を QA の Debug、Debug、Relase、Debug、Relase configuration に変更します。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 14&lt;br&gt;&lt;br&gt;&lt;br&gt;同様に Producdtion の scheme も生成し、他の Xcode の環境でも使えるように Share を ON にしておきます。&lt;br&gt;&lt;br&gt;これで、開発 (Development)、QA、本番 (Production) 環境用に、scheme ができました。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;ここで scheme を選択することで、Run や Archive した時などに、その scheme に指定した Build Configuration の設定が使われます。&lt;br&gt;&lt;br&gt;Xcode で Build Scheme を生成して設定する方法 16&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode で環境ごとの設定をするために Build Scheme を生成して設定する方法をご説明しました。</description><pubDate>Fri, 02 Oct 2020 04:49:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Xcode で Build Configuration を追加する方法</title><link>https://softmoco.com/devenv/how-to-add-build-configuration.php</link><description>Xcode で Build Configuration を追加する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;システム開発をしていると、プログラムを QA 環境や本番環境にデプロイする際に、環境に応じて違う設定を使いたいことがあるかと思います。&lt;br&gt;&lt;br&gt;ここでは、Xcode で環境ごとの設定をするために Build Configuration を追加する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する&lt;br&gt;Build configuration とは、Xcode でビルドの時に使われる設定をひとまとめにしたものです。&lt;br&gt;&lt;br&gt;Xcode で新規プロジェクトを作ると、デフォルトで Debug と Release の configuration が生成されます。&lt;br&gt;&lt;br&gt;Xcode でプロジェクトを開き、左側のナビゲーターエリアの上のプロジェクト名をクリックし、PROJECT のプロジェクト名をクリックし、Info タブの Configurations で確認できます。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;開発、QA、本番環境用に、それぞれ Debug と Release の configuration を作ります。&lt;br&gt;&lt;br&gt;Configurations の箇所で + ボタンをクリックし、[Duplicate &quot;Debug&quot; Configuration] を選択します。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;行が 1 行挿入されるので、Name を QA Debug に変更します。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;再度、Configurations の箇所で + ボタンをクリックし、次は [Duplicate &quot;Release&quot; Configuration] を選択します。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;行が挿入されるので、Name を QA Release に変更します。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;同じ要領で、Production の Debug と Release の configuration を追加します。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;そして元からあった Debug と Release の名前を Development Debug と Development Release に変更します。&lt;br&gt;&lt;br&gt;Xcode で Build Configuration を追加する方法 7&lt;br&gt;&lt;br&gt;これで、開発 (Development)、QA、本番 (Production) 環境用に、それぞれ Debug と Release の configuration ができました。&lt;br&gt;&lt;br&gt; configuration の名前は他の名前でも大丈夫です。 同じ環境の Run や Archive などで Debug と Release と設定を分ける必要のない場合は、各環境 configuration はひとつずつでも大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode で環境ごとの設定をするために Build Configuration を追加する方法をご説明しました。</description><pubDate>Fri, 02 Oct 2020 04:48:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Xcode で Build Configuration &amp; Scheme で環境ごとの設定を管理する方法</title><link>https://softmoco.com/devenv/how-to-manage-multiple-environment-settings-in-xcode.php</link><description>Xcode で Build Configuration &amp; Scheme で環境ごとの設定を管理する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;システム開発をしていると、プログラムを QA 環境や本番環境にデプロイする際に、環境に応じて違う設定を使いたいことがありますよね。&lt;br&gt;&lt;br&gt;方法は何通りかありますが、ここでは、Xcode で build configuration と scheme を作り、Target の Build Settings で環境別のビルド設定をする方法と、xcconfig ファイルを複数生成して管理する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Xcode で Build Configuration を追加する&lt;br&gt;Xcode で Build Scheme を生成して設定する&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする&lt;br&gt;Xcode の ビルド設定の優先順位&lt;br&gt;Xcode の Project エディタで環境ごとのビルド設定をする&lt;br&gt;Xcode で xcconfig ファイルを生成して環境ごとの値を設定する&lt;br&gt;Xcode で xcconfig ファイルを生成する&lt;br&gt;xcconfig ファイルを configurations に設定する&lt;br&gt;xcconfig ファイルに値を追加して設定する&lt;br&gt;xcconfig ファイルの値を Swift のコードで取得する</description><pubDate>Fri, 02 Oct 2020 04:46:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Swift の while ループ</title><link>https://softmoco.com/swift-basics/swift-while.php</link><description>Swift の while ループ&lt;br&gt;&lt;br&gt; &lt;br&gt;Swift でコードを繰り返し実行する（ループする）には、for-in 文か while 文か repeat-while 文を使います。&lt;br&gt;&lt;br&gt;ここでは Swift の while 文 と repeat-while 文についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Swift の while 文&lt;br&gt;Swift の repeat-while 文&lt;br&gt;Swift の while 文&lt;br&gt;Swift の while 文は 条件文が true の間、コードブロックを繰り返し実行します。&lt;br&gt;&lt;br&gt;繰り返す回数が事前にわかっていない時などに便利です。&lt;br&gt;&lt;br&gt;while [条件文] {&lt;br&gt;    ループ中に実行されるコードブロック&lt;br&gt;}&lt;br&gt;最初から条件文が false の時は、コードブロックは一度も実行されません。&lt;br&gt;&lt;br&gt;ループ中に条件文が false になったら、その回はコードブロックを実行せずにループを抜けます。&lt;br&gt;&lt;br&gt;条件文が false にならないと、無限ループになって、永遠にコードブロックが実行され続けてしまいますので、お気をつけください。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、Swift の while 文を使ってループしてみましょう。&lt;br&gt;&lt;br&gt;変数 i を 1 に初期化して、i が 10 より小さい間、コードブロックを繰り返し実行するようにします。&lt;br&gt;&lt;br&gt;コードブロックでは、i を print し、i に 2 ずつ足しています。&lt;br&gt;&lt;br&gt;ループを抜けた後にも i も print しています。&lt;br&gt;&lt;br&gt;var i = 1&lt;br&gt;&lt;br&gt;while i &lt; 10 {&lt;br&gt;    print(&quot;i = \(i)&quot;)&lt;br&gt;    i += 2&lt;br&gt;}&lt;br&gt;&lt;br&gt;print(&quot;final i = \(i)&quot;)&lt;br&gt;&lt;br&gt;実行結果は次のようになります。i が 11 になった時に条件文が false になり、while ループを抜けているのがわかりますね。&lt;br&gt;&lt;br&gt;i = 1&lt;br&gt;i = 3&lt;br&gt;i = 5&lt;br&gt;i = 7&lt;br&gt;i = 9&lt;br&gt;final i = 11&lt;br&gt;Swift の while 文 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Swift の repeat-while 文&lt;br&gt;Swift の repeat-while 文は while 文と似ていて、条件文が true の時にループしますが、実行を続けるかの条件文を後でチェックします。&lt;br&gt;&lt;br&gt;repeat {&lt;br&gt;    ループ中に実行されるコードブロック&lt;br&gt;} while [条件文]&lt;br&gt;最初から条件文が false でも一度はコードブロックが実行されます。&lt;br&gt;&lt;br&gt;こちらも、条件文が false にならないと、無限ループになって、永遠にコードブロックが実行され続けてしまいますので、お気をつけください。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、Swift の repeat-while 文を使ってループしてみましょう。&lt;br&gt;&lt;br&gt;先ほどと同じことをするコードを repeat-while 文を使って書くと次のようになります。&lt;br&gt;&lt;br&gt;var i = 1&lt;br&gt;&lt;br&gt;repeat {&lt;br&gt;    print(&quot;i = \(i)&quot;)&lt;br&gt;    i += 2&lt;br&gt;} while i &lt; 10&lt;br&gt;&lt;br&gt;print(&quot;final i = \(i)&quot;)&lt;br&gt;&lt;br&gt;実行結果は次のようになります。i が 11 になった時に条件文が false になり、repeat-while ループを抜けています。&lt;br&gt;&lt;br&gt;i = 1&lt;br&gt;i = 3&lt;br&gt;i = 5&lt;br&gt;i = 7&lt;br&gt;i = 9&lt;br&gt;final i = 11&lt;br&gt;Swift の while 文 2&lt;br&gt;&lt;br&gt;&lt;br&gt;上の二つのコードの条件文を i &lt; 10 ではなく i &lt; 1 に変更して実行すると、while のほうは一度もコードが実行されませんが、repeat-while のほうは一度実行されているのがわかりますね。&lt;br&gt;&lt;br&gt;Swift の while 文 3&lt;br&gt;&lt;br&gt;Swift の while 文 4&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Swift の while 文 と repeat-while 文についてご説明しました。</description><pubDate>Wed, 30 Sep 2020 01:04:00 GMT</pubDate><category>Swift 入門</category></item>
<item><title>iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法</title><link>https://softmoco.com/devenv/how-to-solve-invalid-app-store-icon-error.php</link><description>iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、Xcode から iOS アプリを TestFlight や App Store にアップロードする時に、以下のような ERROR ITMS-90717: Invalid App Store Icon のエラーが出た時の解決方法をご紹介します。&lt;br&gt;&lt;br&gt;App Store Connect Operation Error&lt;br&gt;ERROR ITMS-90717: &quot;Invalid App Store Icon. The App Store Icon in the asset catalog in &#039;****.app&#039; can&#039;t be transparent nor contain an alpha channel.&quot;&lt;br&gt;&lt;br&gt;iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;このエラーは Apple Store 用のアイコンに透過の設定がされている時におこります。&lt;br&gt;&lt;br&gt;iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;このエラーを解決する方法のひとつをご紹介します。&lt;br&gt;&lt;br&gt;まず、以下の Open With External Editor メニューや、Finder アプリなどから、App Store 用の 1024x1024 の画像をプレビュー アプリで開きます。&lt;br&gt;&lt;br&gt;iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;プレビューアプリのメニューで [ファイル] &gt; [書き出す] を選択します。&lt;br&gt;&lt;br&gt;iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;エクスポートする画面が出てくるので、元の画像を上書きするように同じディレクトリを選択し、アルファのチェックボックをはずして、[保存] ボタンをクリックします。&lt;br&gt;&lt;br&gt;iOS - ERROR ITMS-90717: Invalid App Store Icon の解決方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、Xcode に戻り、もう一度 Archive して Distribute すれば「ERROR ITMS-90717: Invalid App Store Icon」のエラーは消えます。&lt;br&gt;&lt;br&gt;他のアイコンはそのままでもエラーはでませんが、iOS アプリアイコンに透過を使うのは推奨されていないので、1024x1024 のアプリアイコンの画像を元に、他のアイコンを作り直して、全てのアイコンを置き換えてしまっても良いかもしれません。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、ERROR ITMS-90717: Invalid App Store Icon のエラーが出た時の解決方法をご説明しました。</description><pubDate>Thu, 24 Sep 2020 01:03:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
<item><title>Xcode で iOS アプリアイコンを設定する方法</title><link>https://softmoco.com/basics/how-to-set-app-icon-in-xcode.php</link><description>Xcode で iOS アプリアイコンを設定する方法&lt;br&gt;&lt;br&gt;ここでは、Xcode で iOS アプリのアプリアイコン (App Icon) を設定する方法をご説明します。&lt;br&gt;&lt;br&gt;今回は、AnimalPics という名前のアプリに、こんな感じのアプリアイコンを設定します。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;iOS アプリアイコンの Apple のガイドライン&lt;br&gt;iOS アプリアイコンの画像を作る&lt;br&gt;サイズ別の iOS アプリアイコンを生成する&lt;br&gt;Xcode で iOS アプリアイコンを設定する&lt;br&gt;アプリをインストールしてアプリアイコンを確認する&lt;br&gt;iOS アプリアイコンの Apple のガイドライン&lt;br&gt;まず最初に、iOS アプリアイコンについて、Apple のガイドラインをポイントだけ簡単な言葉でまとめておきます。詳細は Apple のサイトでご確認ください。&lt;br&gt;&lt;br&gt;アプリアイコンはできるだけシンプルに。&lt;br&gt;ぱっと見てこのアプリだとわかるようなアプリアイコンにする。&lt;br&gt;ぱっと見て何をするアプリかわかるようなアプリアイコンにする。&lt;br&gt;システムが自動的に角を丸くしてくれるので、アプリアイコンの角は四角のままにする。&lt;br&gt;アプリアイコンに入る文字必要最低限に。&lt;br&gt;アプリアイコンに写真やスクリーンショットなどを使わない。&lt;br&gt;Apple 製品のような顔をしない。&lt;br&gt;アプリアイコンをアプリ内の UI に違う目的で使わない。代わりにアプリアイコンにアプリのテーマカラーを使う。&lt;br&gt;いろんな壁紙でアプリアイコンを確認しておく。&lt;br&gt;アプリアイコンの背景はシンプルにして、透過を使わない。&lt;br&gt;&lt;br&gt;ここで、デザインに関係なく注意しておきたいのは、画像の角をまるめないという点と、透過を使わないという点です。&lt;br&gt;&lt;br&gt;特に透過は、シミュレーターやデバイスを Xcode につないでテストしている時は大丈夫ですが、App Store などで配布しようとした時に「ERROR ITMS-90717: Invalid App Store Icon」のエラーになります。&lt;br&gt;&lt;br&gt;このエラーの解決方法は「ERROR ITMS-90717: Invalid App Store Icon の解決方法」をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリアイコンの画像を作る&lt;br&gt;まず、iOS のアプリアイコンの元となる画像をつくります。&lt;br&gt;&lt;br&gt;必要となる iOS アプリアイコンの中で一番大きい画像のサイズが App Store 用の1024x1024です。&lt;br&gt;&lt;br&gt;お好きな画像エディタで、1024x1024 のアプリアイコンをデザインしてください。&lt;br&gt;&lt;br&gt;この時、アイコンの角はシステムが丸めてくれるので、四角のままで大丈夫です。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 2&lt;br&gt;&lt;br&gt;作成したアプリアイコンの画像を、透明の設定をオフにして、png フォーマットで保存してください。&lt;br&gt;&lt;br&gt;透明の設定がわからない方は、png フォーマットで保存した後で、Mac のプレビューアプリから透明の設定（アルファ）をオフにできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;プレビューアプリのメニューで [ファイル] &gt; [書き出す] を選択し、エクスポートする画面が出てくるので、アルファのチェックボックをはずして、保存すれば OK です。&lt;br&gt;&lt;br&gt;&lt;br&gt;iXcode で iOS アプリアイコンを設定する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;サイズ別の iOS アプリアイコンを生成する&lt;br&gt;iOS アプリのアイコンは、デバイスごとに違ったサイズが必要になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;iOS アプリのプロジェクトを Xcode で開いて、左側のナビゲーターエリアで Assets.xcassets を選択して、AppIcon を選択してください。&lt;br&gt;&lt;br&gt;ターゲットのデバイスに応じて、ここに出てくるサイズのアプリアイコンが必要になります。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;ひとつひとつ画像のサイズを変更して保存し、それをここの枠にドラッグ＆ドロップしていってもいいのですが、オンラインで iOS アプリアイコン用の画像を一括生成してくれるウエブサイトがたくさんあります。&lt;br&gt;&lt;br&gt;「ios app icon generator」などのキーワードで検索してみてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は、App Icon Generator のサイトで、1024x1024 の画像をアップロードして、必要なデバイスを選択し Generate してダウンロードしました。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Xcode で iOS アプリアイコンを設定する&lt;br&gt;生成した iOS アプリアイコンを Xcode で設定します。&lt;br&gt;&lt;br&gt;iOS アプリのプロジェクトを Xcode で開いて、左側のナビゲーターエリアで Assets.xcassets を選択して、AppIcon を選択してください。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 4&lt;br&gt;&lt;br&gt;サイズ別の画像を自分で作った場合は、ここの枠にそれぞれのアイコン画像をドラッグ＆ドロップしていってください。&lt;br&gt;&lt;br&gt;&lt;br&gt;App Icon Generator のサイトなどで一括生成した場合は、ダウンロードされたファイルを解凍すると次のような感じになっていると思います。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;AppIcon を選択し、[Delete Selected Items] で AppIcon を削除します。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;解凍したファイルの中の [AppIcon.appiconset] フォルダを選択し、Xcode の AppIcon があったところにフォルダごとドラッグ＆ドロップします。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;そうすると、それぞれのサイズの iOS のアプリアイコンを自動的に設定してくれます。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;もしうまくいかなかった場合は、ドラッグ＆ドロップした AppIcon を削除して、このエリアで右クリックして [iOS] &gt; [iOS App Icon] で AppIcon の枠を元に戻せますので、ひとつずつ設定するなどしてください。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;アプリをインストールしてアプリアイコンを確認する&lt;br&gt;iOS アプリのアイコンの設定ができたので、アプリをインストールして確認してみましょう。&lt;br&gt;&lt;br&gt;今回は iPhone 11 のシミュレーターを選択して実行ボタンをクリックします。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;アプリがインストールされ起動するので、ホーム画面を出します。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;設定したアプリアイコンが表示されていますね。&lt;br&gt;&lt;br&gt;Xcode で iOS アプリアイコンを設定する方法 13&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Xcode で iOS アプリのアプリアイコン (App Icon) を設定する方法をご説明しました。</description><pubDate>Thu, 24 Sep 2020 00:25:00 GMT</pubDate><category>iOS アプリの開発</category></item>
<item><title>iOS アプリ - Ad Hoc 配布用に .ipa ファイルをホストする方法</title><link>https://softmoco.com/devenv/how-to-host-ipa-file-for-ad-hoc-distribution.php</link><description>iOS アプリ - Ad Hoc 配布用に .ipa ファイルをホストする方法 (over-the-air distribution)&lt;br&gt;&lt;br&gt; &lt;br&gt;今回は Ad Hoc 配布を over-the-air distribution (インターネットでファイルをダウンロードしてインストールする方法) で行います。&lt;br&gt;&lt;br&gt;このページでは、Ad Hoc 配布用に .ipa ファイル（iOS アプリのバイナリファイル）などをホストする方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;Xcode で Ad Hoc 配布用の .ipa ファイルなどの生成とエクスポートができている前提で進めます。&lt;br&gt;&lt;br&gt;まだの方は Ad Hoc 配布 (Ad Hoc distribution) のメニューに戻って生成してください。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Ad Hoc 配布用のマニフェストファイル .plist を準備する&lt;br&gt;インストールリンク用の html ファイルを作成してホストする&lt;br&gt;Ad Hoc 配布でデバイスに iOS アプリをインストールする&lt;br&gt;Over-the-air 配布がうまくいかない時のヒント&lt;br&gt;Ad Hoc 配布用のマニフェストファイル .plist を準備する&lt;br&gt;まずは、Ad Hoc 配布用のマニフェストファイル .plist を準備します。&lt;br&gt;&lt;br&gt;Xcode から .ipa ファイルなどを生成してエクスポートすると以下のようなファイルできたと思います。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この中で、Ad Hoc 配布用にホストするのは .plist ファイル（マニフェストファイル）と .ipa ファイル（iOS アプリのバイナリファイル）です。&lt;br&gt;&lt;br&gt;どちらのファイルもファイル名を変更しても大丈夫です。 今回は TableViewTest.ipa を AnimalPics.ipa に変更しました。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;エディタで manifest.plist ファイルを開くと中身は次のような感じになっていると思います。&lt;br&gt;&lt;br&gt;必要に応じて、14・20・26・32・34・40 行目の [ ] の箇所を変更してください。&lt;br&gt;&lt;br&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;br&gt;&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;&lt;br&gt;&lt;plist version=&quot;1.0&quot;&gt;&lt;br&gt;&lt;dict&gt;&lt;br&gt; &lt;key&gt;items&lt;/key&gt;&lt;br&gt; &lt;array&gt;&lt;br&gt;  &lt;dict&gt;&lt;br&gt;   &lt;key&gt;assets&lt;/key&gt;&lt;br&gt;   &lt;array&gt;&lt;br&gt;    &lt;dict&gt;&lt;br&gt;     &lt;key&gt;kind&lt;/key&gt;&lt;br&gt;     &lt;string&gt;software-package&lt;/string&gt;&lt;br&gt;     &lt;key&gt;url&lt;/key&gt;&lt;br&gt;     &lt;string&gt;[ipa ファイルへの https の URL]&lt;/string&gt;&lt;br&gt;    &lt;/dict&gt;&lt;br&gt;    &lt;dict&gt;&lt;br&gt;     &lt;key&gt;kind&lt;/key&gt;&lt;br&gt;     &lt;string&gt;display-image&lt;/string&gt;&lt;br&gt;     &lt;key&gt;url&lt;/key&gt;&lt;br&gt;     &lt;string&gt;[57x57 のアプリ画像ファイルへの https の URL]&lt;/string&gt;&lt;br&gt;    &lt;/dict&gt;&lt;br&gt;    &lt;dict&gt;&lt;br&gt;     &lt;key&gt;kind&lt;/key&gt;&lt;br&gt;     &lt;string&gt;full-size-image&lt;/string&gt;&lt;br&gt;     &lt;key&gt;url&lt;/key&gt;&lt;br&gt;     &lt;string&gt;[512x512 のアプリ画像ファイルへの https の URL]&lt;/string&gt;&lt;br&gt;    &lt;/dict&gt;&lt;br&gt;   &lt;/array&gt;&lt;br&gt;   &lt;key&gt;metadata&lt;/key&gt;&lt;br&gt;   &lt;dict&gt;&lt;br&gt;    &lt;key&gt;bundle-identifier&lt;/key&gt;&lt;br&gt;    &lt;string&gt;[アプリの Bundle ID]&lt;/string&gt;&lt;br&gt;    &lt;key&gt;bundle-version&lt;/key&gt;&lt;br&gt;    &lt;string&gt;[アプリの Bundle バージョン]&lt;/string&gt;&lt;br&gt;    &lt;key&gt;kind&lt;/key&gt;&lt;br&gt;    &lt;string&gt;software&lt;/string&gt;&lt;br&gt;    &lt;key&gt;platform-identifier&lt;/key&gt;&lt;br&gt;    &lt;string&gt;com.apple.platform.iphoneos&lt;/string&gt;&lt;br&gt;    &lt;key&gt;title&lt;/key&gt;&lt;br&gt;    &lt;string&gt;[アプリ名]&lt;/string&gt;&lt;br&gt;   &lt;/dict&gt;&lt;br&gt;  &lt;/dict&gt;&lt;br&gt; &lt;/array&gt;&lt;br&gt;&lt;/dict&gt;&lt;br&gt;&lt;/plist&gt;&lt;br&gt;URL は全て https でエラーや警告が出ずにアクセスできる状態なくてはなりません。&lt;br&gt;&lt;br&gt;display-image と full-size-image の dict エレメントはなくても Ad Hoc 配布できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回 Ad Hoc 配信する、AnimalPics アプリでは、次のように設定しました。&lt;br&gt;&lt;br&gt;[ipa ファイルへの https の URL]&lt;br&gt;https://softmoco.com/distTest/AnimalPics.ipa&lt;br&gt;[57x57 のアプリ画像ファイルへの https の URL]&lt;br&gt;https://softmoco.com/distTest/img57.png&lt;br&gt;[512x512 のアプリ画像ファイルへの https の URL]&lt;br&gt;https://softmoco.com/distTest/img512.png&lt;br&gt;[アプリの Bundle ID]&lt;br&gt;com.softmoco.AnimalPics&lt;br&gt;[アプリの Bundle バージョン]&lt;br&gt;1.0&lt;br&gt;[アプリ名]&lt;br&gt;AnimalPics&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;インストールリンク用の html ファイルを作成してホストする&lt;br&gt;続いて、iOS アプリをインストールする為のリンク用の html ファイルを準備します。&lt;br&gt;&lt;br&gt;次のファイルを index.html という名前で保存しました。&lt;br&gt;&lt;br&gt;&lt;!DOCTYPE html&gt;&lt;br&gt;&lt;html lang=&quot;ja&quot;&gt;&lt;br&gt;&lt;head&gt;&lt;br&gt;  &lt;meta charset=&quot;UTF-8&quot;&gt;&lt;br&gt;  &lt;title&gt;AnimalPics&lt;/title&gt;&lt;br&gt;&lt;/head&gt;&lt;br&gt;&lt;body&gt;&lt;br&gt;  &lt;h1&gt;&lt;br&gt;  　&lt;a href=&quot;itms-services://?action=download-manifest&amp;url=https://softmoco.com/distTest/manifest.plist&quot;&gt;AnimalPics アプリをインストールする&lt;/a&gt;&lt;br&gt;  &lt;/h1&gt;&lt;br&gt;&lt;/body&gt;&lt;br&gt;&lt;/html&gt;&lt;br&gt;&lt;br&gt;ポイントは 9 行目だけで、クリックして iOS アプリをダウンロードしてインストールするためのリンクを配置します。&lt;br&gt;&lt;br&gt;&lt;a href=&quot;itms-services://?action=download-manifest&amp;url=[plist ファイルへの https の URL]&quot;&gt;アプリをインストールする&lt;/a&gt;&lt;br&gt;&lt;br&gt;URL は https でエラーや警告が出ずにアクセスできる状態なくてはなりません。&lt;br&gt;&lt;br&gt;&lt;br&gt;image ファイルも 57x57 と 512x512 サイズのアプリのアイコン画像を png フォーマットで準備しました。&lt;br&gt;&lt;br&gt;これで Ad Hoc 配布用に .ipa ファイルをホストする準備ができました。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 4&lt;br&gt;&lt;br&gt;これらのファイルを指定した URL でアクセスできるところにアップロードしてください。&lt;br&gt;&lt;br&gt;今回は https://softmoco.com/distTest/ のディレクトリの下に全てのファイルをアプロードしました。&lt;br&gt;&lt;br&gt;&lt;br&gt;Ad Hoc 配布でデバイスに iOS アプリをインストールする&lt;br&gt;それでは、Ad Hoc 配布で iPhone にアプリをインストールしてみましょう。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用の Provisioning Profile を作った時に選択したデバイスから、インストールリンクがある html ファイルをブラウザで開きます。&lt;br&gt;&lt;br&gt;[AnimalPics アプリをインストールする] リンクをタップします。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;&quot;softmoco.com&quot; would like to install &quot;AnimalPics&quot; という確認ダイアログ出てくるので、[Install] をタップします。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ダイアログボックスが消え、Home 画面に戻ると AnimalPics アプリがインストールされています。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;AnimalPics アプリが起動でき、これで Ad Hoc 配布 (Ad Hoc distribution) によるインストールが完了です。&lt;br&gt;&lt;br&gt;Ad Hoc 配布用に .ipa ファイルをホストする方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Over-the-air 配布がうまくいかない時のヒント&lt;br&gt;Over-the-air の Ad Hoc 配布 (Ad Hoc distribution) がうまく行かない方の為に、私が試して確認したことを書き留めておきます。&lt;br&gt;&lt;br&gt;うまくインストールできた方はとばしてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;.plist ファイル、.ipa ファイル、画像ファイルへのリンクは https でなくてはならず、エラーや警告が出ていてもうまくいきません。&lt;br&gt;&lt;br&gt;自己署名証明書を使う場合は、各デバイスにもルートCA証明書、中間CA証明書をインストールする必要があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;インストールの URL から .plist ファイルなどが取得される際、ブラウザからアクセスする時と違って、セッション ID などの情報が送信されないようです。&lt;br&gt;&lt;br&gt;その状態でログインが必要になる場所に .plist ファイルなどがあると、インストールが開始しません。&lt;br&gt;&lt;br&gt;&lt;br&gt;インストールリンクの URL の .plist の後にクエリ文字列を続けるとインストールが開始しませんでした。&lt;br&gt;&lt;br&gt;また、インストールリンクの URL が https://www.test.com/GetManifestFile のような形でマニフェストファイルと全く同じ内容、同じ content-type で xml を返したとしてもインストールできませんでした。&lt;br&gt;&lt;br&gt;私が試した限りマニフェストファイルの URL は .plist で終わらないとインストールが開始しませんでした。&lt;br&gt;&lt;br&gt;&lt;br&gt;マニフェストファイル内の .ipa などの URL の後にはクエリ文字列を続けても大丈夫ですし、https://www.test.com/GetBinaryFile のような URL でもインストールできました。&lt;br&gt;&lt;br&gt;&lt;br&gt;IIS などのウエブサーバでファイルをそのままホストしていて、ブラウザでファイルにアクセスできない時は、ウエブサーバの MIME Types に .ipa は application/octet-stream、.plist は application/xml か text/html が設定されているか確認し、なければ追加してみてください。&lt;br&gt;&lt;br&gt;プログラムでバイナルファイルを読み込んだり、マニフェストファイルを動的に生成してダウンロードするようにしている場合も、レスポンスの content-type を上記のように指定してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;まとまりなく思いついたことを書いてしまいましたが、何か問題解決のお役にたてば幸いです。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Ad Hoc 配布用に .ipa ファイルをホストする方法をご説明しました。</description><pubDate>Sat, 19 Sep 2020 04:00:00 GMT</pubDate><category>iOS アプリの開発環境</category></item>
</channel>
</rss>
