2017-10-15 8 views
1

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() 
    } 

} 

答えて

1

誤差はかなり明確です:CLLocationCoordinate2Dがこのアーカイバは、構造体をエンコードすることはできませんstructです。

簡単な回避策は、latitudelongitudeを別々にエンコードしてデコードすることです。

ちなみに、Stringのプロパティは両方とも非オプション値で初期化されているため、非オプションとしても宣言されています。変更されないと思われる場合は、定数としても宣言します(let

var title: String 
var subtitle: String 

... 

required init?(coder aDecoder: NSCoder) { 
    title = aDecoder.decodeObject(forKey: "title") as! String 
    subtitle = aDecoder.decodeObject(forKey: "subtitle") as! String 
    let latitude = aDecoder.decodeDouble(forKey: "latitude") 
    let longitude = aDecoder.decodeDouble(forKey: "longitude") 
    coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(title, forKey: "title") 
    aCoder.encode(subtitle, forKey: "subtitle") 
    aCoder.encode(coordinate.latitude, forKey: "latitude") 
    aCoder.encode(coordinate.longitude, forKey: "longitude") 
} 
関連する問題