項目種別
訂正
伝えた回
記載日
Feb 20, 2022 8:32 AM
関連資料
Objective-C Bridge で生成された String
型は、元の NSString
型とは無関係なインスタンスに置き換えられると思い込んでいたのですが、勉強会の中で @Mikhail Apurin さんに教えていただいたコードから、少なくとも現行で、実は String
型のインスタンスの内部に元の NSString
型由来のインスタンス(ただし copy()
で得られるもの)を内包している様子でした。
import Foundation
class CustomString: NSString {
override var length: Int { 8 }
override func character(at index: Int) -> unichar { .random(in: 65...90) }
// NSString -> String 変換の時は copy はされている
override func copy(with zone: NSZone? = nil) -> Any { self }
}
let s = CustomString()
// NSString として扱っているのでもちろん毎回ランダムになる
print(s)
print(s)
print(s)
let x = s as String
// String で let なのに毎回違う出力になる
print(x)
print(x)
print(x)