「iOS アプリ開発デザインパターン入門」を読んでの備忘録

こちらの本を読んで分からなかった内容を調べた(これから調べる)際のメモ


1. @objc func ~~~ の @objc って何ぞや?

答え

@objc を付けるとObjective-C側から呼び出す事ができる

詳細

1. Objective-Cではメソッドをコンパイルすると2つの隠し引数(selfcmd)を持った関数が生成される

2. Swiftでは1つのを隠し引数(オブジェクト自身)を持った関数が生成される

3. 隠し引数の数の違いによって相互利用が出来なくなってしまう

4. @objc を付けることでコンパイル時に2つの隠し引数を持ったメソッドが生成できる

補足

プロパティにも @objc をつけることができるみたい

参考

[Swift] @objcの話 [Objective-C]


2. @escaping って何ぞや?

答え

@escaping を付けるとクロージャをスコープ外で保持できる

class A {

private let storedClosure: () -> ()
// escapingを付けないとエラーになる
init(closure: @escaping () -> ()) {
storedClosure = closure
}
}

補足

1. @escaping したクロージャ内でフィールド変数を参照する場合には self を付ける

2. 循環参照に気を付ける

class A {

private let storedClosure: () -> ()
// escapingを付けないとエラーになる
init(closure: @escaping () -> ()) {
storedClosure = closure
}
}

class B {
private var a: A?
private var count = 0

func doSomething() {
// (2) 循環参照を避けるためにselfを弱参照する
a = A(closure: { [weak self] in
// (1) フィールド変数のcountにアクセスするためにselfを付ける
self?.count += 1
})
}
}

do {
let b = B()
b.doSomething()
}

参考

Swiftの @escaping と weak/unowned の理解

Swift 3 の @escaping とは何か


3. fileprivate って何ぞや?

答え

同一ファイル内であればアクセスできる修飾子

(名前の通りそのままですね)

private修飾子との違い


Hello.swift

class A {

private var hoge = "hoge"
fileprivate var fuga = "fuga"
}

let a = A()
print(a.hoge) // 'hoge' is inaccessible due to 'private' protection level
print(a.fuga) // fuga



最後に

初めての投稿で「@」が謎のリンクになっていたので、そちらの解決方法もメモしておきます

答え

@を<span>タグで囲う

@arusu0629@arusu0629

<span>@</span>arusu0629 → @arusu0629

参考

Qiitaのマークダウンで @(アットマーク)リンクの無効化に苦戦