anyobject – 自分が見落としていた、基本の話
TRANSCRIPT
![Page 1: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/1.jpg)
![Page 2: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/2.jpg)
![Page 4: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/4.jpg)
![Page 5: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/5.jpg)
![Page 6: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/6.jpg)
![Page 7: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/7.jpg)
![Page 8: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/8.jpg)
![Page 9: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/9.jpg)
![Page 10: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/10.jpg)
![Page 11: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/11.jpg)
![Page 12: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/12.jpg)
switch instance {
case 0 as Double: print("0 of Double")
case let value as Int: print("\(value) of Int")
case is Double: print("Double")
}
![Page 13: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/13.jpg)
![Page 14: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/14.jpg)
![Page 15: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/15.jpg)
![Page 16: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/16.jpg)
![Page 17: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/17.jpg)
let object = "Casual" as AnyObject
let count: Int? = object.length let _: Void? = object.append?("Swift")
![Page 18: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/18.jpg)
// 通常通りに実行可能(メソッドは IUO 属性付き) let result: String = object.appending("Swift")
// 通常は、メソッドに応じられない場合は強制終了 let result: String = object.appending("Swift")
// メソッドに ? をつけて、ディスパッチ可能性も判定 let result: String? = object.appending?("Swift")
![Page 19: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/19.jpg)
// 通常通りに実行可能、ただし戻り値は Optional 型 let count: Int? = object.length
![Page 20: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/20.jpg)
![Page 21: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/21.jpg)
class MyClass : NSObject {
func myFunction(_ v: Int) -> Int {…} }
let object = MyClass() as AnyObject let result: Int? = object.myFunction?(10)
![Page 22: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/22.jpg)
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
![Page 23: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/23.jpg)
protocol MyClassProtocol : AnyObject { }
class MyClass : NSObject, MyClassProtocol { func myFunction(_ v: Int) -> Int {…} }
let object = MyClass() as MyClassProtocol let result: Int? = object.myFunction?(10)
![Page 24: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/24.jpg)
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
![Page 25: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/25.jpg)
// 原則、動的ディスパッチが可能 class Object : NSObject {
func method1() -> Int {…}
// 動的ディスパッチしたくないものに @nonobjc を付与 @nonobjc func method2() -> Int {…} }
![Page 26: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/26.jpg)
// 原則、動的ディスパッチは不可 class Object {
func method1() -> Int {…}
// 動的ディスパッチしたいものに @objc を付与 @objc func method2() -> Int {…} }
![Page 27: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/27.jpg)
@objc protocol Protocol {
func method() }
class Object : Protocol {
func method() {} }
![Page 28: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/28.jpg)
class Object { @objc(otherName) func originalName() {} }
let object = Object() as AnyObject
object.originalName?() // .some(())
object.otherName?()
![Page 29: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/29.jpg)
class OtherClass { @objc func otherName() {} } class Object { @objc(otherName) func originalName() {} } let object = Object() as AnyObject
object.originalName?() // .some(()) object.otherName?() // .some(())
![Page 30: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/30.jpg)
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(())
![Page 31: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/31.jpg)
class MyClass : NSObject {
func myFunction(_ v: Int) -> Int {…} }
let object = MyClass() as AnyObject let result: Int? = object.xxxx?(10)
![Page 32: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/32.jpg)
func doSomething() {
class Object: NSObject {
// このシグネチャーは認識されない。動的実行は可 func someMethod() {} } }
![Page 33: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/33.jpg)
![Page 34: AnyObject – 自分が見落としていた、基本の話](https://reader031.vdocuments.pub/reader031/viewer/2022020119/587123991a28abe4448b59f5/html5/thumbnails/34.jpg)