Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios encodeWithCoder无法识别的选择器已发送到实例_Ios_Swift_Cocoa Touch_Nsdata_Nscoding - Fatal编程技术网

Ios encodeWithCoder无法识别的选择器已发送到实例

Ios encodeWithCoder无法识别的选择器已发送到实例,ios,swift,cocoa-touch,nsdata,nscoding,Ios,Swift,Cocoa Touch,Nsdata,Nscoding,我得到了这个例外,但我不知道我错在哪里。我正在编写扩展以尝试将此结构从NewsAPISwiftLibrary保存到NSUserDefaults: 这是我的分机的代码: extension NewsAPISource { init?(data: NSData) { if let coding = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as? Encoding { id = cod

我得到了这个例外,但我不知道我错在哪里。我正在编写扩展以尝试将此结构从NewsAPISwiftLibrary保存到NSUserDefaults:

这是我的分机的代码:

extension NewsAPISource {

    init?(data: NSData) {
        if let coding = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as? Encoding {
            id = coding.id
            name = coding.name
            sourceDescription = coding.sourceDescription
            url = coding.url
            category = coding.category
            language = coding.language
            country = coding.country
            sortBysAvailable = coding.sortBysAvailable as [SortBy]
        } else {
            return nil
        }
    }

    func encode() -> NSData {
        return NSKeyedArchiver.archivedData(withRootObject: Encoding(self)) as NSData
    }

    private class Encoding: NSObject, NSCoding {

        let id: SourceId?
        let name: String?
        let sourceDescription: String?
        let url: String?
        let category: NewsAPISwift.Category?
        let language: Language?
        let country: Country?
        let sortBysAvailable: [SortBy]

        init(_ source: NewsAPISource) {
            id = source.id
            name = source.name
            sourceDescription = source.sourceDescription
            url = source.url
            category = source.category
            language = source.language
            country = source.country
            sortBysAvailable = source.sortBysAvailable
        }

        required init?(coder aDecoder: NSCoder) {
            id = aDecoder.decodeObject(forKey: "id") as? SourceId
            name = aDecoder.decodeObject(forKey: "name") as? String
            sourceDescription = aDecoder.decodeObject(forKey:"sourceDescription") as? String
            url = aDecoder.decodeObject(forKey: "url") as? String
            category = aDecoder.decodeObject(forKey: "category") as? NewsAPISwift.Category
            language = aDecoder.decodeObject(forKey: "language") as? Language
            country = aDecoder.decodeObject(forKey: "country") as? Country

            if let sorts = aDecoder.decodeObject(forKey: "sortBysAvailable") as? [SortBy] {
                self.sortBysAvailable = sorts
            } else {
                return nil
            }
        }

        func encode(with aCoder: NSCoder) {
            aCoder.encode(id, forKey: "id")
            aCoder.encode(name, forKey: "name")
            aCoder.encode(sourceDescription, forKey: "sourceDescription")
            aCoder.encode(url, forKey: "url")
            aCoder.encode(category, forKey: "category")
            aCoder.encode(language, forKey: "language")
            aCoder.encode(country, forKey: "country")
            aCoder.encode(sortBysAvailable, forKey: "sortBysAvailable")    
        }    
    }
}
我创建了一个新结构,如下所示:

let emptySource = NewsAPISource(id: "nil", name: "nil", sourceDescription: "nil", url: "nil", category: .business, language: .english, country: .unitedStates, sortBysAvailable: [.top])
emptySourceArray.encode()
并尝试对其进行如下编码:

let emptySource = NewsAPISource(id: "nil", name: "nil", sourceDescription: "nil", url: "nil", category: .business, language: .english, country: .unitedStates, sortBysAvailable: [.top])
emptySourceArray.encode()
这是导致异常的行。你知道我做错了什么吗

完全错误是:

***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[\u SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例0x6080005F4D0”


目标国家/地区是否也符合NSCoding?@FabioBerger Country是一个字符串枚举,那么SourceId和Language呢^^@FabioBerger SourceID是字符串的类型别名,Language是另一个字符串枚举,Category是另一个字符串枚举,[SortBy]是字符串枚举数组。@foobar5512
String
enum
s仍然是
enum
s,因此无法符合
NSCoding
。您将需要对其
原始值
进行编码,这是一个
字符串
(桥接到
NSString
,它符合
NSCoding
)。