【发布时间】:2016-11-05 18:57:03
【问题描述】:
尝试将 MKMapItem 保存为我的自定义类的一部分。
import UIKit
import MapKit
class Place: NSObject, NSCoding {
var mapItem : MKMapItem!
var type : Category!
init(mapItem: MKMapItem, type: Category) {
self.mapItem = mapItem
self.type = type
}
// MARK: NSCoding
required init?(coder decoder: NSCoder) {
mapItem = decoder.decodeObject(forKey: "mapItem") as! MKMapItem?
type = decoder.decodeObject(forKey: "type") as! Category?
}
func encode(with coder: NSCoder) {
coder.encode(mapItem, forKey: "mapItem")
coder.encode(type, forKey: "type")
}
}
但这行不通,因为 MKMapItem 不符合 NSCoding 标准(尽管编译器不会抱怨)。我确实了解如何对自定义类进行编码,但不知道如何对 iOS 已经定义的对象进行编码。
我知道 Objective-C 对此有一个答案,但我真的很想要一个 Swift 解决方案。谢谢。
PS 我已经尝试子类化 MKMapItem 并提供“新的”初始化程序,即使它需要在其他地方进行大量代码更改。但这会导致“无法分配给属性:'placemark' 是一个只能获取的属性”。 'placemark' 和 'isCurrentLocation' 都是 get-only。
import UIKit
import MapKit
class NewMapItem: MKMapItem {
required init(placemark: MKPlacemark, isCurrentLocation:Bool, name: String, phoneNumber: String, url: URL, timeZone: TimeZone) {
self.placemark = placemark //compiler complains "get-only"
self.isCurrentLocation = isCurrentLocation //compiler complains "get-only"
self.name = name
self.phoneNumber = phoneNumber
self.url = url
self.timeZone = timeZone
}
// MARK: NSCoding
init?(coder decoder: NSCoder) {
placemark = (decoder.decodeObject(forKey: "placemark") as! MKPlacemark?)! //compiler complains "get-only"
isCurrentLocation = decoder.decodeBool(forKey: "isCurrentLocation") //compiler complains "get-only"
name = decoder.decodeObject(forKey: "name") as? String
phoneNumber = decoder.decodeObject(forKey: "phoneNumber") as? String
url = decoder.decodeObject(forKey: "url") as! URL?
timeZone = decoder.decodeObject(forKey: "timeZone") as! TimeZone?
}
func encode(with coder: NSCoder) {
coder.encode(placemark, forKey: "placemark")
coder.encode(isCurrentLocation, forKey: "isCurrentLocation")
coder.encode(name, forKey: "name")
coder.encode(phoneNumber, forKey: "phoneNumber")
coder.encode(url, forKey: "url")
coder.encode(timeZone, forKey: "timeZone")
}
}
【问题讨论】: