16. プリミティブな値は取得できない?
performSelector
let obj = NSString(string: "TEST.TXT")
// 戻り値が NSInteger (long) 相当だと nil になる
let length:Int =
obj.performSelector("length")
.takeRetainedValue()
Execution was interrupted, reason: EXC_BAD_ACCESS.
17. プリミティブな引数は受け取れない?
performSelector
let obj = NSString(string: "TEST.TXT")
// NSUInteger (unsigned long) 相当を渡せない
let length:Int =
obj.performSelector("characterAtIndex:",
withObject: UInt(1))
.takeRetainedValue()
Execution was interrupted, reason: signal SIGABRT.
characterAtIndex: Range or index out of bounds.
18. プリミティブな引数は受け取れない?
performSelector
let obj = NSString(string: "TEST.TXT")
// NSNumber に変換しても渡せない
let length:Int =
obj.performSelector("characterAtIndex:",
withObject: NSNumber(unsignedInteger:1))
.takeRetainedValue()
Execution was interrupted, reason: signal SIGABRT.
characterAtIndex: Range or index out of bounds.
29. 整数を返すメソッドは実行できない
performSelector
let obj = MyClass()
// Int 型の戻り値は取得できない
let value:Int =
obj.performSelector("asInteger")
.takeRetainedValue()
Execution was interrupted, reason: EXC_BAD_ACCESS.
32. ObjC 互換クラスを返すメソッドは実行可能
performSelector
let obj = MyClass()
// 自作 ObjC 互換クラスは取得できるが AnyObject
let result:AnyObject =
obj.performSelector("asObjC")
.takeRetainedValue()
// キャストして正常に使用できる
let value:Int
= (result as! ObjCClass).value
33. Swift クラスを返すメソッドは実行できない
performSelector
let obj = MyClass()
// Swift ネイティブ型の戻り値は取得できない
let value:Int =
obj.performSelector("asNative")
.takeRetainedValue()
Execution was interrupted, reason: signal SIGABRT.
asNative: unrecognized selector sent to instance.
38. ▶ ObjC で使いたい Swift クラスに付与
▶ NSObject を継承していなくても良い
@objc
これまで
▶ ObjC 互換な Swift クラスに付与
▶ NSObject を継承している必要がある
これから
39. // NSObject を継承しないクラスには付けられない
@objc class SwiftClass {
}
// NSObject を継承するクラスには付けてもいい
@objc class SwiftClass : NSObject {
}
Only classes that inherit from NSObject
can be declared @objc
コンパイル時の扱われ方
@objc class
74. 関数はメソッドと同じルールに変更
引数のラベル付けルール
// このような 関数 定義のとき
func getPrice(price:Int, tax:Double) -> Int
// Swift 1 では両方にラベル名が不要
getPrice(100, 0.05)
// Swift 2 では第二引数以降でラベル名が必要
getPrice(100, tax: 0.05)
75. ▶ 外部引数名の明記が必須
▶ 同じ名前でも # で表記できない
func getPrice(#price:Int) -> Int
func getPrice(price price:Int) -> Int
外部ラベル名の省略表記が廃止
引数のラベル付けルール
'#' has been removed from Swift; double up 'price price' to
make the argument label the same as the parameter name
100. // 再帰的な列挙型を定義
enum Language : String {
case Swift
case ObjectiveC = "Objective-C"
case C
case Ruby
}
// 未設定のものは列挙子名と同じ文字列が得られる
Language.Swift.rawValue
列挙子と同じ文字列なら省略可能に
Raw 値
列列挙⼦子と違う場合だけ
明記すれば OK