anyobject – 自分が見落としていた、基本の話
TRANSCRIPT
switch instance {
case 0 as Double: print("0 of Double")
case let value as Int: print("\(value) of Int")
case is Double: print("Double")
}
let object = "Casual" as AnyObject
let count: Int? = object.length let _: Void? = object.append?("Swift")
// 通常通りに実行可能(メソッドは IUO 属性付き) let result: String = object.appending("Swift")
// 通常は、メソッドに応じられない場合は強制終了 let result: String = object.appending("Swift")
// メソッドに ? をつけて、ディスパッチ可能性も判定 let result: String? = object.appending?("Swift")
// 通常通りに実行可能、ただし戻り値は Optional 型 let count: Int? = object.length
class MyClass : NSObject {
func myFunction(_ v: Int) -> Int {…} }
let object = MyClass() as AnyObject let result: Int? = object.myFunction?(10)
class MyClass : NSObject {
func myFunction(_ v: Any) -> NSNumber {…} }
let object = MyClass() as NSObject let result: Unmanaged<AnyObject>? = object.perform(MyClass.myFunction(_:), with: 5) let resultValue: Int? = result?.takeRetainedValue().intValue
protocol MyClassProtocol : AnyObject { }
class MyClass : NSObject, MyClassProtocol { func myFunction(_ v: Int) -> Int {…} }
let object = MyClass() as MyClassProtocol let result: Int? = object.myFunction?(10)
class Object : NSObject { func method1() -> Int {…} @nonobjc func method2() -> Int {…} }
let object = Object() as AnyObject
let result1 = object.method1?() // .some(x) let result2 = object.method2?() // .none
// 原則、動的ディスパッチが可能 class Object : NSObject {
func method1() -> Int {…}
// 動的ディスパッチしたくないものに @nonobjc を付与 @nonobjc func method2() -> Int {…} }
// 原則、動的ディスパッチは不可 class Object {
func method1() -> Int {…}
// 動的ディスパッチしたいものに @objc を付与 @objc func method2() -> Int {…} }
@objc protocol Protocol {
func method() }
class Object : Protocol {
func method() {} }
class Object { @objc(otherName) func originalName() {} }
let object = Object() as AnyObject
object.originalName?() // .some(())
object.otherName?()
class OtherClass { @objc func otherName() {} } class Object { @objc(otherName) func originalName() {} } let object = Object() as AnyObject
object.originalName?() // .some(()) object.otherName?() // .some(())
class OtherClass { @objc func originalName() {} @objc func otherName() {} } class Object { @objc(otherName) func originalName() {} } let object = Object() as AnyObject
object.originalName?() // ambiguous use of … object.otherName?() // .some(())
class MyClass : NSObject {
func myFunction(_ v: Int) -> Int {…} }
let object = MyClass() as AnyObject let result: Int? = object.xxxx?(10)
func doSomething() {
class Object: NSObject {
// このシグネチャーは認識されない。動的実行は可 func someMethod() {} } }