Created
October 3, 2016 13:22
-
-
Save takasek/6ba32b799663802b1a5be574212b70f5 to your computer and use it in GitHub Desktop.
as AnyObject, as Anyによるboxingの挙動について調べてみた #CodePiece
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
do { | |
let value = 1 | |
let a = value as AnyObject | |
let b = value as AnyObject | |
a === b //false | |
//値型は、as AnyObjectのタイミングでclassインスタンスにboxingされる | |
//as AnyObjectのタイミングが異なれば、別のclassインスタンスとしてboxingされる | |
} | |
do { | |
let value = 1 as Any | |
let a = value as AnyObject | |
let b = value as AnyObject | |
a === b //false | |
//as Anyしても値型は値型。classインスタンスでboxingされるのはas AnyObjectのタイミング。 | |
} | |
do { | |
let value = 1 as AnyObject | |
let a = value as AnyObject | |
let b = value as AnyObject | |
a === b //true | |
//as AnyObjectは何度やってもインスタンスに変化なし | |
} | |
do { | |
let value = 1 as NSNumber | |
let a = value as AnyObject | |
let b = value as AnyObject | |
a === b //true | |
//というか、すでにclassインスタンスであれば、as AnyObjectしてもインスタンスに変化なし | |
} | |
do { | |
let value = 1 as AnyObject | |
let a = value as! NSValue | |
let b = value as! NSNumber | |
a === b //true | |
//as AnyObjectだけでなく、具体的なclassへのキャストだとしてもインスタンスに変化なし | |
} | |
do { | |
let value = 1 as NSNumber | |
let a = value as Any as AnyObject | |
let b = value as Any as AnyObject | |
a === b //true | |
//すでにclassインスタンスであれば、以降as Anyしてもboxingは維持される | |
} | |
do { | |
let value = 1 as NSNumber | |
let a = value as AnyObject | |
let b = value as Int as AnyObject | |
a === b //false | |
//ただし、値型へのキャストが入ったら、その時点でboxingは解除される | |
} | |
do { | |
let a = Bool(1) as AnyObject | |
let b = Bool(true) as NSNumber as Any as AnyObject | |
a === b //true | |
//おまけ:Bool値だけは何故か同じインスタンスへの参照になるようだ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment