項目種別
訂正
登場した回
伝えた回
分類
StringNSStringObjective-C ブリッジ (Objective-C Bridge)NSCopyingNSMutableCopying
記載日
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)