Swiftでクラスのオブジェクトをコピーする
SwiftでクラスのオブジェクトをコピーするにはNSCopyingプロトコルに準拠させて
その時にここで代入を忘れたら?オプショナル型だと代入忘れも気付かない?などと不安になる。
どうしたもんかなあと思ったが、元々そのコピーしたいクラスが保存のためNSSecureCodingプロトコルに準拠させてた。
なので、試しにUserDefaults使って保存して、すぐ取り出して別オブジェクトとしてみた。
実行すると意図通りコピーできたけど、、、なんか邪道な気がする、、、(-_-;
macOS 10.15.7 Catalina
Xcode 12.0.1
Swift 5.3
func copy(with zone: NSZone? = nil) -> Any↑このメソッドを書くのが基本みたいなんだが、、、コピーしたいクラスには変数がいっぱいあって、しかも今後増えるかもしれない。
その時にここで代入を忘れたら?オプショナル型だと代入忘れも気付かない?などと不安になる。
どうしたもんかなあと思ったが、元々そのコピーしたいクラスが保存のためNSSecureCodingプロトコルに準拠させてた。
なので、試しにUserDefaults使って保存して、すぐ取り出して別オブジェクトとしてみた。
class Person: NSObject, NSSecureCoding {↑コピーする部分のコード(do/try/catchとかは略してる)。
func copyWithUserDefaults() -> Person {
let userDefaults = UserDefaults()
let key = "Person_data"
//save
let data = try! NSKeyedArchiver.archivedData(withRootObject: self,
requiringSecureCoding: true)
userDefaults.set(data, forKey: key)
//load
if let data = userDefaults.object(forKey: key) as? Data {
let classes = [Person.self]
if let person = try! NSKeyedUnarchiver.unarchivedObject(ofClasses: classes,
from: data) as? Person {
userDefaults.removeObject(forKey: key)
return person
}
}
abort()
}
実行すると意図通りコピーできたけど、、、なんか邪道な気がする、、、(-_-;
macOS 10.15.7 Catalina
Xcode 12.0.1
Swift 5.3
スポンサーサイト