【问题标题】:Conforming to NSCoding符合 NSCoding
【发布时间】:2016-12-16 22:46:48
【问题描述】:

我一生都无法弄清楚为什么我会收到此类不符合 NSCoding 协议的错误。也许另一双眼睛会有所帮助。我试图添加 cmets 以明确每个函数在做什么。

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

【问题讨论】:

    标签: swift nsuserdefaults nscoding


    【解决方案1】:

    提示:按Cmd + 4 打开问题导航器,Xcode 会告诉你更多细节。

    在 Swift 3 中,编码功能发生了变化:

    func encodeWithCoder(coder: NSCoder) {
        // Swift 2 and older
    }
    
    func encode(with coder: NSCoder) {
        // Swift 3
    }
    

    更改方法的签名,你应该没问题

    【讨论】:

      【解决方案2】:

      在 Swift 4 中,还有另一种编码/解码类的方法。现在您只需遵守协议Codable。不再需要编写所有的编码和解码,它支持没有 NSObject & enums & structs 的类。

      final class Search: Codable {
      
      }
      

      欲了解更多信息,请阅读https://developer.apple.com/documentation/swift/codable

      【讨论】:

      • 这不是真的。 NSCoding 完全不会消失。你仍然需要它。你根本没有回答这个问题。
      • 您不再需要 NSCoding 来在 Swift 4 中解码/编码。如果您阅读更多信息链接,您就会明白。这确实不是问题的答案,我提供了另一种更最新的解码/编码方式。
      • 你的第一句话是错误的。 NSCoding 并没有完全改变。它根本没有改变。而且您仍然会遇到实施encode(with) 的需要,并且您没有解释要做什么。最后,您的答案与所问的内容无关。而且它只是链接。这是一个无用的错误答案。
      • 我想你不明白。 Codable 是 Swift 4 解码/编码类/结构/枚举的方法。您仍然可以使用 NSCoding,但这些仅适用于具有 NSObject 的类。如果使用 Codable,则不需要实现encode(with: ),它是可选的。
      • 没错,但不是你在回答中所说的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多