頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


Swiftでクラスのオブジェクトをコピーする

SwiftでクラスのオブジェクトをコピーするにはNSCopyingプロトコルに準拠させて
func copy(with zone: NSZone? = nil) -> Any
↑このメソッドを書くのが基本みたいなんだが、、、コピーしたいクラスには変数がいっぱいあって、しかも今後増えるかもしれない。
その時にここで代入を忘れたら?オプショナル型だと代入忘れも気付かない?などと不安になる。

どうしたもんかなあと思ったが、元々そのコピーしたいクラスが保存のためNSSecureCodingプロトコルに準拠させてた。
なので、試しにUserDefaults使って保存して、すぐ取り出して別オブジェクトとしてみた。
class Person: NSObject,  NSSecureCoding {

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()
}
↑コピーする部分のコード(do/try/catchとかは略してる)。
実行すると意図通りコピーできたけど、、、なんか邪道な気がする、、、(-_-;



macOS 10.15.7 Catalina
Xcode 12.0.1
Swift 5.3
スポンサーサイト




<< Swiftでポインタがdangling pointerだと警告が出る  TopPage  App Clipに対応する >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1363-0b0251af




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.