符合 NSCoding
Conforming to NSCoding
我一辈子都弄不明白为什么我会收到此 class 不符合 NSCoding 协议的错误。也许另一双眼睛会有所帮助。我试图添加注释以明确每个函数在做什么。
import Foundation
import UIKit
class Search: NSObject, NSCoding {
// Global Variables
var articlePicture: UIImage!
var articleTitle: String
// MARK: Public Init
init(articlePicture: UIImage, articleTitle: String) {
self.articlePicture = articlePicture
self.articleTitle = articleTitle
}
// Required NSCoding Protocol
required convenience init?(coder decoder: NSCoder) {
guard let articlePicture = decoder.decodeObject(forKey: "articlePicture") as? UIImage,
let articleTitle = decoder.decodeObject(forKey: "articleTitle") as? String
else { return nil }
self.init(
articlePicture: articlePicture,
articleTitle: articleTitle
)
}
// Required NSCoding Protocal
func encodeWithCoder(coder: NSCoder) {
coder.encode(self.articlePicture, forKey: "articlePicture")
coder.encode(self.articleTitle, forKey: "articleTitle")
}
// Initialize [Search]
static var searches = [Search]()
static func getSearches() -> [Search]{
return searches
}
static func setSearch(search: Search){
searches.append(search)
}
// NSUserDefaults Searches Array funcs
static func saveSearches(){
let searchData = NSKeyedArchiver.archivedData(withRootObject: searches)
UserDefaults.standard.set(searchData, forKey: "searches")
}
static func loadSearches() -> [Search]{
let searchData = UserDefaults.standard.object(forKey: "searches") as? NSData
if let searchData = searchData {
searches = (NSKeyedUnarchiver.unarchiveObject(with: searchData as Data) as? [Search])!
return searches
}
return searches
}
}
提示:按Cmd + 4
打开问题导航器,Xcode会告诉你更多细节。
在Swift3中,编码函数发生了变化:
func encodeWithCoder(coder: NSCoder) {
// Swift 2 and older
}
func encode(with coder: NSCoder) {
// Swift 3
}
更改方法的签名,应该没问题
在Swift4中还有一种方法encode/decode类。现在您只需遵守协议 Codable
。不再需要编写所有编码和解码,它支持 类 没有 NSObject & 枚举 & 结构。
final class Search: Codable {
}
有关详细信息,请阅读 https://developer.apple.com/documentation/swift/codable
我一辈子都弄不明白为什么我会收到此 class 不符合 NSCoding 协议的错误。也许另一双眼睛会有所帮助。我试图添加注释以明确每个函数在做什么。
import Foundation
import UIKit
class Search: NSObject, NSCoding {
// Global Variables
var articlePicture: UIImage!
var articleTitle: String
// MARK: Public Init
init(articlePicture: UIImage, articleTitle: String) {
self.articlePicture = articlePicture
self.articleTitle = articleTitle
}
// Required NSCoding Protocol
required convenience init?(coder decoder: NSCoder) {
guard let articlePicture = decoder.decodeObject(forKey: "articlePicture") as? UIImage,
let articleTitle = decoder.decodeObject(forKey: "articleTitle") as? String
else { return nil }
self.init(
articlePicture: articlePicture,
articleTitle: articleTitle
)
}
// Required NSCoding Protocal
func encodeWithCoder(coder: NSCoder) {
coder.encode(self.articlePicture, forKey: "articlePicture")
coder.encode(self.articleTitle, forKey: "articleTitle")
}
// Initialize [Search]
static var searches = [Search]()
static func getSearches() -> [Search]{
return searches
}
static func setSearch(search: Search){
searches.append(search)
}
// NSUserDefaults Searches Array funcs
static func saveSearches(){
let searchData = NSKeyedArchiver.archivedData(withRootObject: searches)
UserDefaults.standard.set(searchData, forKey: "searches")
}
static func loadSearches() -> [Search]{
let searchData = UserDefaults.standard.object(forKey: "searches") as? NSData
if let searchData = searchData {
searches = (NSKeyedUnarchiver.unarchiveObject(with: searchData as Data) as? [Search])!
return searches
}
return searches
}
}
提示:按Cmd + 4
打开问题导航器,Xcode会告诉你更多细节。
在Swift3中,编码函数发生了变化:
func encodeWithCoder(coder: NSCoder) {
// Swift 2 and older
}
func encode(with coder: NSCoder) {
// Swift 3
}
更改方法的签名,应该没问题
在Swift4中还有一种方法encode/decode类。现在您只需遵守协议 Codable
。不再需要编写所有编码和解码,它支持 类 没有 NSObject & 枚举 & 结构。
final class Search: Codable {
}
有关详细信息,请阅读 https://developer.apple.com/documentation/swift/codable