UserDefaults
を使用してカスタムクラスの配列を格納しようとしています。カスタムクラスは、文字列とCLLocationCoordinate2D
が混在したアノテーション用です。カスタムクラスのストレージ - 構造体をエンコードできません
マップビューで長押しのジェスチャを実行すると、ArchiveUtil.savePins(pins: pins)
が呼び出されます。 [:で:NSKeyedArchiver encodeValueOfObjCType]:このアーカイバは私が間違ってやっているものを構造体
任意のアイデアをエンコードすることはできません -
しかし、私はエラー
を取得していますか?
おかげで、以下のコード:
class PinLocation: NSObject, NSCoding, MKAnnotation { var title: String? var subtitle: String? var coordinate: CLLocationCoordinate2D init(name:String, description: String, lat:CLLocationDegrees,long:CLLocationDegrees){ title = name subtitle = description coordinate = CLLocationCoordinate2DMake(lat, long) } required init?(coder aDecoder: NSCoder) { title = aDecoder.decodeObject(forKey: "title") as? String subtitle = aDecoder.decodeObject(forKey: "subtitle") as? String coordinate = aDecoder.decodeObject(forKey: "coordinate") as! CLLocationCoordinate2D } func encode(with aCoder: NSCoder) { aCoder.encode(title, forKey: "title") aCoder.encode(subtitle, forKey: "subtitle") aCoder.encode(coordinate, forKey: "coordinate") } }
class ArchiveUtil { private static let PinKey = "PinKey" private static func archivePins(pin: [PinLocation]) -> NSData{ return NSKeyedArchiver.archivedData(withRootObject: pin as NSArray) as NSData } static func loadPins() -> [PinLocation]? { if let unarchivedObject = UserDefaults.standard.object(forKey: PinKey) as? Data{ return NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [PinLocation] } return nil } static func savePins(pins: [PinLocation]?){ let archivedObject = archivePins(pin: pins!) UserDefaults.standard.set(archivedObject, forKey: PinKey) UserDefaults.standard.synchronize() } }