Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #303】RxRealmを使って、設定変更後、即時に表示に反映するサンプル

はじめに

  • RxRealmはRealmをRxSwiftでラップしている
  • Realmのデータ変更をObservableで取得できるところが便利

この記事について

Realmに保存された設定値を監視し、変更されたら、即時に表示を即時に変更することをやりたい

RxRealm

github.com

完成イメージ

  1. 初期表示 f:id:fjswkun:20170717164058p:plain

  2. 左バーボタンをタップ f:id:fjswkun:20170717164136p:plain

「青」をタップ

  1. 「青」タップ後の表示 f:id:fjswkun:20170717164218p:plain

  2. 右バーボタンをタップ f:id:fjswkun:20170717164346p:plain

「緑」をタップ

  1. 「緑」タップ後の表示 f:id:fjswkun:20170717164426p:plain

実装

ナビゲーションバーに関する設定値をRealmに保存する。設定が変更されたら、即時にその設定を表示に反映させる

import UIKit
import RealmSwift
import RxRealm
import RxSwift

class ViewController: UIViewController {
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        do{
            let realm = try Realm()
            
            // ナビゲーションバーの設定値をサブスクライブ
            let navigationBarColor = realm.objects(Setting.self).filter("key=%ld", SettingKey.navigationBarColor.rawValue).first!
            Observable.from(object: navigationBarColor)
                .map{ color in return ColorParam(rawValue: color.param)?.uicolor ?? ColorParam.empty.uicolor }
                .subscribe(onNext: { self.navigationController?.navigationBar.backgroundColor = $0 })
                .disposed(by: disposeBag)

            // tintカラーの設定値をサブスクライブ
            let tintColor = realm.objects(Setting.self).filter("key=%ld", SettingKey.tintColor.rawValue).first!
            Observable.from(object: tintColor)
                .map{ color in return ColorParam(rawValue: color.param)?.uicolor ?? ColorParam.empty.uicolor }
                .subscribe(onNext: { self.navigationController?.navigationBar.tintColor = $0 })
                .disposed(by: disposeBag)
            
        }catch(let e){ print(e.localizedDescription) }
    }

    @IBAction func tapLeftBarButton(_ sender: UIBarButtonItem) {
        let sheet = UIAlertController(title: "上部バーの背景色の変更", message: "変更する色を選択してください", preferredStyle: .actionSheet)
        let actions = ColorParam.all.map{ param -> UIAlertAction in
            let action = UIAlertAction(title: param.name, style: .default){ _ in
                let selected = Setting()
                selected.key = SettingKey.navigationBarColor.rawValue
                selected.param = param.rawValue
                
                do{
                    let realm = try Realm()
                    try realm.write {
                        realm.add(selected, update: true)
                    }
                }catch(let e){
                    print(e.localizedDescription)
                }
            }
            return action
        }
        actions.forEach{ sheet.addAction($0) }
        present(sheet, animated: true, completion: nil)
    }

    @IBAction func tapRightBarButton(_ sender: UIBarButtonItem) {
        let sheet = UIAlertController(title: "上部バーのテキストカラーの変更", message: "変更する色を選択してください", preferredStyle: .actionSheet)
        let actions = ColorParam.all.map{ param -> UIAlertAction in
            let action = UIAlertAction(title: param.name, style: .default){ _ in
                let selected = Setting()
                selected.key = SettingKey.tintColor.rawValue
                selected.param = param.rawValue
                
                do{
                    let realm = try Realm()
                    try realm.write {
                        realm.add(selected, update: true)
                    }
                }catch(let e){
                    print(e.localizedDescription)
                }
            }
            return action
        }
        actions.forEach{ sheet.addAction($0) }
        present(sheet, animated: true, completion: nil)
    }
    
}

サンプル

SampleRxRealm.zip - Google ドライブ

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事

【iOS Swift入門 #302】非同期処理のobservableをテストする(RxSwift, RxBlocking)

はじめに

非同期処理のobservableをテストをする場合、RxBlockingを使います。 RxBlockingはRxSwiftレポジトリに含まれていますが、RxSwiftとは別にimportする必要があります。

RxBlogkingに含まれているtoBlockingメソッドを使うと、非同期のobservableを同期のobservableに変換することができます。toBlockingメソッドを使わなくても非同期処理のテストを書くことができますが、書かなければいけないコードが多くなります。

テストコード

iTunes Search APIを使った検索処理」をテストします。 affiliate.itunes.apple.com

テスト対象

SearchAPI構造体を作成しました。

import Foundation
import RxSwift
import RxCocoa

struct SearchAPI{
    typealias JSONType = [String:Any]
    private static let baseURL = "https://itunes.apple.com/search?term="
    
    static func search(term:String) -> Observable<JSONType>{
        let urlString = baseURL + term
        let url = URL(string: urlString)!
        let request = URLRequest(url: url)
        
        return URLSession.shared.rx.response(request: request)
            .filter{ return (200 ..< 300 ~= $0.0.statusCode) }
            .map{ (_, data) -> JSONType in
                guard
                    let json = try? JSONSerialization.jsonObject(with: data, options: []),
                    let result = json  as? JSONType
                else{
                    return [:]
                }
                return result
            }
    }
}

search(term:)は与えられた検索文字列でiTunes Search APIに検索リクエストを実行します。内部ではURLSessionが使われています。URLSessionのリクエストは非同期で実行されるため、search(term:)は非同期処理となります。search(term:)メソッドをXCTestでテストします。

コード

APIJSONレスポンスにresultCountというキーがあります。有名なアーティストの名前を検索条件にすれば、たいてい1以上の値が返ってきます。この値が1以上であることをテストします。

RxBlockingを使った場合テストコード、使わない場合のテストコードを書きました。

import XCTest
@testable import SampleRx

import RxSwift
import RxTest
import RxBlocking

class SampleRxTests: XCTestCase {
    private let disposeBag = DisposeBag()
    
    // RxBlockingを使わなかった場合
    func testSearchAPI_normal(){
        let observable = SearchAPI.search(term: "johnson")
        
        var result = [String: Any]()
        let expectation = self.expectation(description: #function)
        observable.subscribe(onNext: { json in
            result = json
            expectation.fulfill()
        })
        .disposed(by: disposeBag)
        
        
        waitForExpectations(timeout: 1.0){ error in
            let resultCount = result["resultCount"] as! Int
            XCTAssertTrue(resultCount > 0)
        }
    }
    
    // RxBlockingを使った場合
    func testSearchAPI(){
        let observable = SearchAPI.search(term: "johnson")
        let result = try! observable.toBlocking().last()!
        let resultCount = result["resultCount"] as! Int
        
        XCTAssertTrue(resultCount > 0)
    }
}

RxBlockingを使ったほうがテストコードの行数が少なくなります。そのため、わかりやすいと思いませんか?

サンプル

こちらからダウンロード SampleRx.zip - Google ドライブ

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事

【iOS Swift入門 #301】Eurekaを使って設定画面の作成

はじめ

テーブルビューを使って、設定画面を作ることがよくある。 よくあるのだから共通化するのがよいのですが、 アプリを作るたびにUITableViewを使って、 Delegateを実装したりしてがんばって作っていました。

探してみると便利なライブラリがあるのでした。

名前はEurekaです。

github.com

これを使って、簡単な設定画面っぽいものを作りました。

導入

CocoaPods

Podfileに下記追加して、pod install or pod updateを実行する

pod 'Eureka'

Carthage

Cartfileに下記追加して、carthage updateを実行する

github "xmartlabs/Eureka" ~> 3.0

実装

画面イメージ

初期画面 f:id:fjswkun:20170523220843p:plain

項目を入力・選択し、「Save」ボタンを押すと、入力・選択した内容がコンソールに表示されます

Nickname入力時 f:id:fjswkun:20170523220928p:plain

Birthday選択時 f:id:fjswkun:20170523221005p:plain

Theme Color選択時 別画面で選択させることができます

f:id:fjswkun:20170523221103p:plain

ソース

import UIKit
import Eureka

enum ThemeColor: String{
    case blue = "blue"
    case red = "red"
    case lightGray = "lightGray"
    case yellow = "yellow"
    
    static func all() -> [ThemeColor]{
        return [
            ThemeColor.blue,
            ThemeColor.red,
            ThemeColor.lightGray,
            ThemeColor.yellow
        ]
    }
}

class ViewController: FormViewController {
    var nickname = ""
    var birthday = Date()
    var alertOn = true
    var themeColor = ThemeColor.blue
    var priority = 0
    
    static var dateFormat: DateFormatter = {
        let f = DateFormatter()
        f.dateFormat = "yyyy/MM/dd"
        
        return f
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        form
        // Profile
        +++ Section("My Profile")
            <<< TextRow(){
                $0.title = "Nickname"
                $0.placeholder = "optional"
                $0.onChange{ [unowned self] row in
                    self.nickname = row.value ?? ""
                }
            }
            <<< DateRow(){
                $0.title = "Birthday"
                $0.dateFormatter = type(of: self).dateFormat
                $0.minimumDate = type(of: self).dateFormat.date(from: "1900/01/01") ?? Date()
                $0.onChange{ [unowned self] row in
                    self.birthday = row.value ?? Date()
                }
            }
        
        // Setting
        +++ Section("Settings")
            <<< SwitchRow(){
                $0.title = "alert"
                $0.value = true
                $0.onChange{ [unowned self] row in
                    self.alertOn = row.value ?? true
                }
            }
            <<< PushRow<String>(){
                $0.title = "Theme Color"
                $0.options = ThemeColor.all().map{$0.rawValue}
                $0.onChange{[unowned self] row in
                    self.themeColor = ThemeColor(rawValue: row.value!) ?? ThemeColor.blue
                }
            }
            <<< SegmentedRow<String>(){
                $0.title = "Priority"
                $0.value = "0"
                $0.options = ["0", "1", "2"]
                $0.onChange{ [unowned self] row in
                    self.priority = Int(row.value ?? "0")!
                }
            }
        
        // Button
        +++ Section()
            <<< ButtonRow(){
                $0.title = "Save"
                $0.onCellSelection{ [unowned self] cell, row in
                    self.printAll()
                }
            }
        
    }
    
    private func printAll(){
        print("Nickname:", nickname)
        print("Birthday:", birthday)
        print("Alrt:", (alertOn ? "On": "Off"))
        print("Theme Color:", themeColor.rawValue)
        print("Priority:", priority)
    }
}

サンプルダウンロード

SampleEureka.zip - Google ドライブ

おわりに

テキストフィールドやデートピッカーやスイッチ、その他たくさん部品が用意されていますが、 自身でカスタム部品を作ることもできるようです。 また、後日にやってみます。

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事

【iOS Swift入門 #300】[RxSwift]observableをトリガーとして使う(withLatestFrom)

はじめに

あるobservableをトリガーとするobservableを作ることができます。 例えば、ボタンタップをトリガーとして、テキストフィールドに 入力されたテキストを表示すること、などができます。

もっと実用的な例としては、ボタンタップをトリガーとして、 テキストフィールドに入力されたテキストでAPIに リクエストすることなどが考えられます。

トリガーを使うobservableを作るoperatorは下記2つが使われます。

  • withLatestFrom(_: )
  • sample(_: )

ここでは特に使われることが多いwithLatestFrom(_: )について見ていきます。

RxSwiftについてしっかり学びたいなら、こちらの書籍がおすすめです。

withLatestFrom(_: )

トリガーからnextイベントが送られてくるたびにnextイベントを送ります。

例ボタンタップするとテキストフィールドの入力値をラベルに表示する

画面

初期表示
f:id:fjswkun:20170519214835p:plain

テキスト入力
f:id:fjswkun:20170519214843p:plain

ボタンタップ
f:id:fjswkun:20170519214851p:plain

ラベルに入力値が表示されます。

ソース

画面はstoryboardを使って作っています。

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var resultLabel: UILabel!
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let observable = button.rx.tap.asObservable().withLatestFrom(textField.rx.text)
        observable.subscribe(onNext: { [weak self] text in
            self?.resultLabel.text = text
        })
        .disposed(by: disposeBag)
    }
}

サンプル入手

SampleTrigger1.zip - Google ドライブ

例ボタンタップするとテキストフィールドの入力値を使ってAPIにりくえすとする

APIiTunes Search APIを使用します。
https://affiliate.itunes.apple.com/resources/documentation/itunes_search_api_jp/

画面

初期表示
f:id:fjswkun:20170519222323p:plain

テキスト入力
f:id:fjswkun:20170519222331p:plain

ボタンタップ f:id:fjswkun:20170519222339p:plain

APIが実行され、結果が画面下のテキストビューに表示されます。
APIJSONレスポンスはStringにパースしました。

ソース

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var textView: UITextView!
    
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let observable = button.rx.tap.asObservable().withLatestFrom(textField.rx.text)
        
        observable
            .map{ $0 ?? ""}
            .flatMap(search)
            .map{ (_, data) in
                return String(data: data, encoding: .utf8) ?? ""
            }
            .observeOn(MainScheduler.instance)
            .subscribe(onNext: { [weak self] result in
                self?.textView.text = result
            })
            .disposed(by: disposeBag)
    }
    
    func search(word: String) -> Observable<(HTTPURLResponse, Data)>{
        let baseURL = "https://itunes.apple.com/search?term="
        guard let url = URL(string: baseURL + word) else{
            return Observable.never()
        }
        let request = URLRequest(url: url)
        
        return URLSession.shared.rx.response(request: request)
    }
}

サンプル入手

SampleTrigger2.zip - Google ドライブ

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事

【iOS Swift入門 #299】[RxSwift]バインドできるプロパティを作成する

この記事を読んでわかること

  • RxSwift(RxCocoa)でUIプロパティを拡張すること

はじめに

RxSwift(RxCocoa)ではObservableのbind(to:)メソッドを使い、 ObservableとUI部品のプロパティをバインドすることができます。

例)テキストフィールドの入力をラベルにバインドする

textField.rx.text.asObservable()
    .bindTo(label.rx.text)
    .disposed(by: bag)

RxCocoaではUILabelでバインドできるプロパティは
textとattributedTextの2つしか用意されていません。
他のプロパティもバインドできるようにしたい場合、
どうすればいいのか?

UIプロパティを拡張する

例として、テキストフィールドの入力文字数が

  • 奇数の場合、ラベルの背景色を黄色にする
  • 偶数の場合、ラベルの背景色を青にする

をバインドを使って実現したいとします。

RxCocoaではUILabelのbackgroundColorプロパティは用意されていません。
rxからアクセスできるtextプロパティやattributedTextプロパティが
どのように作成されているか、実際のソースを見てみます。

UILabel+Rx.swift

    //
    //  UILabel+Rx.swift
    //  RxCocoa
    //
    //  Created by Krunoslav Zaher on 4/1/15.
    //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
    //
    
    #if os(iOS) || os(tvOS)
    
    #if !RX_NO_MODULE
    import RxSwift
    #endif
    import UIKit
    
    extension Reactive where Base: UILabel {
        
        /// Bindable sink for `text` property.
        public var text: UIBindingObserver<Base, String?> {
            return UIBindingObserver(UIElement: self.base) { label, text in
                label.text = text
            }
        }
    
        /// Bindable sink for `attributedText` property.
        public var attributedText: UIBindingObserver<Base, NSAttributedString?> {
            return UIBindingObserver(UIElement: self.base) { label, text in
                label.attributedText = text
            }
        }
        
    }
    
    #endif

UIBindingObserverタイプのプロパティを作ってあげればよいとわかります。
ここではbackgroundColorという名前でプロパティを作成します。

UILabel+Sample.swiftという名前でファイルを作成しました。

    import RxSwift
    import RxCocoa
    
    extension Reactive where Base: UILabel{
        var backgroundColor: UIBindingObserver<Base, UIColor>{
            return UIBindingObserver(UIElement: self.base){
                label, backgroundColor in
                label.backgroundColor = backgroundColor
            }
        }
    }

これを使ってテキストフィールドとラベルをバインドします。

    import UIKit
    import RxSwift
    import RxCocoa
    
    class ViewController: UIViewController {
        @IBOutlet weak var textField: UITextField!
        @IBOutlet weak var label: UILabel!
        private let bag = DisposeBag()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            textField.rx.text.asObservable()
                .map(toColor(from:))
                .bindTo(label.rx.backgroundColor)
                .disposed(by: bag)
            
        }
        
        // 文字数からUIColorを計算する
        private func toColor(from text:String?) -> UIColor{
            let isEven = ((text ?? "").characters.count % 2 == 0)
            let color = isEven ? UIColor.blue : UIColor.yellow
            return color
        }
    }

サンプルアプリ

①アプリを起動します テキストフィールドの入力文字数は、0文字で偶数なので、ラベルの背景色は青となります。

f:id:fjswkun:20170428145005p:plain

②1文字入力します テキストフィールドの入力文字数は、1文字で奇数なので、ラベルの背景色は黄となります。

f:id:fjswkun:20170428145034p:plain

③もう1文字入力します。(合計2文字となります) テキストフィールドの入力文字数は、2文字で偶数なので、ラベルの背景色は青となります。

f:id:fjswkun:20170428145048p:plain

サンプルソースのダウンロード

SampleCreateBinder.zip - Google ドライブ

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事

【iOS Swift入門 #298】Swift3.1での変更点「Sequenceプロトコル(Array等)への関数追加」

この記事を読んでわかること

  • Swift3.1での変更点
  • prefix(while:)とdrop(while:)の使い方

Sequenceプロトコル(Array等)への関数追加

prefix(while:)とdrop(while:)が追加された。

prefix(while:)

先頭の要素から「条件を満たさなくなる」までの値の配列を返す。

例: 条件は「100未満の値」

100の時点で条件を満たさなくなる。 そのため、最後の5は返されない。

let nums = [1, 2, 3, 10, 20, 30, 100, 200, 300, 5]
let prefixed = nums.prefix(while: {$0 < 100})
// [1, 2, 3, 10, 20, 30]

例: 条件は「1文字以上」

先頭の要素が空文字で条件を満たさないため、 2番めの要素以降は返されない。

let words = ["", "A", "B", "C", "A1", "A2", "A3", "A1X", "A2X", "A3X"]
let words_prefixed = words.prefix(while: {x in x.characters.count > 0})
// []

drop(while:)

先頭の要素から「条件を満たす」要素をスキップする。 条件を満たさなくなった要素「以降」の配列を返す。

例: 条件は「100未満の値」

先頭から30までの要素は条件を満たすため、スキップされる。 それ以降の配列が返される。

let nums = [1, 2, 3, 10, 20, 30, 100, 200, 300, 5]
let dropped nums.drop(while: {$0 < 100})
// [100, 200, 300, 5]

例: 条件は「1文字以上」

先頭の要素が条件を満たさない。 全ての要素を含む配列が返される。

let words = ["", "A", "B", "C", "A1", "A2", "A3", "A1X", "A2X", "A3X"]
let words_prefixed = words.drop(while: {x in x.characters.count > 0})
// ["", "A", "B", "C", "A1", "A2", "A3", "A1X", "A2X", "A3X"]

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事

【iOS Swift入門 #297】Swift3.1での変更点「Intのイニシャライザが追加」

この記事を読んでわかること

  • Swift3.1での変更点
  • init?(exactly:)の使い方

Intのイニシャライザが追加

Swift3.1でInt型で下記イニシャライザが追加された。

init?(exactly:)

小数点以下の切り捨てや切上げ、四捨五入が必要なければ、 Intを返す。そうでなければ、nilを返す。
つまり、小数点以下が0以外であればnilが返ってくる。

いくつか例を書いた。

let num1 = Int(exactly: 1.0)  // 3のInt型
let num2 = Int(exactly: 2)  // 2のInt型
let num3 = Int(exactly: 3.1)  // nil
let num4 = Int(exactly: 4.01)  // nil
let num5 = Int(exactly: 5)  // 5のInt型

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事