こちらの本を読んで分からなかった内容を調べた(これから調べる)際のメモ
1. @objc func ~~~ の @objc って何ぞや?
答え
@objc を付けるとObjective-C側から呼び出す事ができる
詳細
1. Objective-Cではメソッドをコンパイルすると2つの隠し引数(self
とcmd
)を持った関数が生成される
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修飾子との違い
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