swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介...

56

Upload: tomohiro-kumagai

Post on 08-Jan-2017

1.290 views

Category:

Software


4 download

TRANSCRIPT

Page 1: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 2: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 4: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 5: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 6: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 7: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 8: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 9: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 10: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 11: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 12: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 13: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 14: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 15: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 16: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 型は名詞で名前をつける。 struct Queue { … }

// 変数名は名詞でつける。 let queue = Queue()

// 真偽値プロパティーは主張重視。配列が空であるか。 items.isEmpty

Page 17: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// item は items が扱う主体 items.add(item)

// index は items が扱う主体ではない items.remove(at: index)

// 複数で位置を示すときは前置詞を名前に含めることも items.moveTo(x: 3, y: 5)

Page 18: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 名詞系で、自身に影響しない場合は、名詞そのまま。 let answer = value.squareRoot()

// 名詞系で、自身に影響する場合は“form”接頭辞。 value.formSquareRoot()

// 動詞系で、自身に影響ないなら“-ed”か“-ing”接尾辞。 let answer = value.divided(by: 3)

// 動詞系で、自身に影響するなら、動詞そのまま。 value.divide(by: 3)

Page 19: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 範囲が、ある範囲と、重なる点があるか if range1.overlaps(range2) { … }

// 配列が、要素を、含んでいるか if items.contains(item) { … }

// 要素を返してるのか、要素を含むか判定してるのか。 let answer = items.contained(item) { … }

Page 20: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 列挙子の名前は小文字で始める。 enum Drink { case coffee case tea case water }

Page 21: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// キューの最初、と表現できる。 extension Queue { func first -> Element? { … } }

// 所属が定まらない場合に、大域関数として扱う。 func max(_ x: Int, _ y: Int, _ z: Int)

// 数値の絶対値、所属はあっても abs(x) が慣習的。 func abs(_ x: Int) -> Int

Page 22: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 23: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

class Controller : UIViewController {

@IBOutlet var titleLabel: UILabel!

override func viewDidLoad() {

super.viewDidLoad()

titleLabel.text = "ISAO meetup" }

}! や ? で中身を取り出す操作をしなくても自動で取り出される

Page 24: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

Type!

Type?

let value: Type!

Page 25: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 型に ! を添えて定義する(従前どおり) let implicitly: Int! = 100

// 型明記せずに受けると、その変数は普通の Optional 型 let optional = implicitly

Int?

Page 26: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// Int! を返す関数があったとき … func something() -> Int! {…}

// 暗黙アンラップとして即使用する方法(受け手は戻り値の型) let result = something().advanced(by: 1)

// 速やかに解消する方法(受け手は Int 型) let result = something()!

// nil の可能性を残して先へ(受け手は Int? 型) let result = something()

Page 27: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

let values = Array<Int!>

// Int! 型のまま持ち歩くのを防ぐことで、 // 取り出した時に初めて nil だったことに気づくのを予防

Page 28: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 29: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

for value in 0 ..< 100 {

} CountableRange<Int> : Sequence

Page 30: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 31: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 32: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

1

1

2

3

5

1

1

1

1

2

3

1

1

1

Page 33: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

struct Fibonacci : Sequence { struct Iterator : IteratorProtocol { fileprivate var data = (0, 1) mutating func next() -> Int? { defer { data = (data.1, data.0 + data.1) } return data.1 } } func makeIterator() -> Iterator { return Iterator() } }

Page 34: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

let fibonacci = AnySequence { () -> AnyIterator<Int> in

var data = (0, 1)

return AnyIterator {

defer {

data = (data.1, data.0 + data.1) }

return data.1 } }

Page 35: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

var previous2 = 0 let fibonacci = sequence(first: 1) { previous1 in

defer { previous2 = previous1 }

return previous1 + previous2 }

Page 36: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

let fibonacci = sequence(state: (0, 1)) { (state: inout (Int, Int)) -> Int? in

defer { state = (state.1, state.0 + state.1) }

return state.1 }

Page 37: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 38: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// Swift 3 での探し方 let value: Int? = fibonacci.first { $0 > 100 }

// Swift 2 での探し方 var value: Int? { for v in fibonacci where v > 100 { return v } return nil }

Page 39: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 40: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 次のインデックスを取得 let next = index.successor()

// 前のインデックスを取得 let previous = index.predeessor()

Page 41: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 扱うインデックスの範囲 let indices = items.indices

// あるインデックスの次を取得 let next = items.index(after: index)

// あるインデックスの前を取得 let previous = items.index(before: index)

Page 42: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

Kumagai Sato TanakaKudo

successor successorpredecessor

Page 43: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

Kumagai

Kudo

Sato

Tanaka

開始インデックス

終端インデックス

index(before: "Kumagai")

index(after: "Kumagai")

index(after: "Sato")

Page 44: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 指定した距離だけ先のインデックスを取得

items.startIndex.advancedBy(5) items.index(items.startIndex, offsetBy: 5)

// インデックス間の距離を取得

items.startIndex.distanceTo(items.endIndex) items.distance(from: items.startIndex, to: items.endIndex)

Page 45: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 46: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

var currentValue = 0

let closure = { () -> Int in

currentValue += 1

return currentValue }

内側で、外の変数をそのまま使える

Page 47: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// 明記がないものは、非エスケープなクロージャー func doSomething(predicate: () -> Int) { }

// エスケープ可能にしたい場合は、明記が必要に func doSomething(predicate: @escaping () -> Int) { }

Page 48: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

func transfer(content: Data, completionHandler: @escaping () -> Void) {

// 非同期処理など、別のスコープへ渡せる DispatchQueue.main.async {

completionHandler() } }

Page 49: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

func transfer(content: Data, completionHandler: () -> Void) {

// 非同期処理など、別のスコープへ持ち出せない DispatchQueue.main.async {

completionHandler() } }

Page 50: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

// たとえ、素性の知れない関数であっても … func callBlackBox(predicate: () -> Int)

// @noescape なら循環参照の心配はない callBlackBox { return self.items.count }

Page 51: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

クロージャー

変数

変数 Non-Escapeクロージャー

変数

Page 52: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

クロージャー

変数

変数

変数

Escapingクロージャー

Page 53: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

クロージャー obj Escapingクロージャー

プロパティー

obj: Object

Page 54: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp

class Object {

var completion: (() -> Void)?

func request(completion f: @escaping ()->Void) {

…; completion = f } }

let obj = Object()

// 循環参照を起こすか、外からはわかりづらい obj.request { print(obj) }

Page 55: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Page 56: Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp