Skip to content

Instantly share code, notes, and snippets.

@takasek
Created October 3, 2016 13:22
Show Gist options
  • Save takasek/6ba32b799663802b1a5be574212b70f5 to your computer and use it in GitHub Desktop.
Save takasek/6ba32b799663802b1a5be574212b70f5 to your computer and use it in GitHub Desktop.
as AnyObject, as Anyによるboxingの挙動について調べてみた #CodePiece
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