当前位置: 首页 > 面试题库 >

Swift:不符合协议NSCoding

谢雅珺
2023-03-14
问题内容

我试图在我快速编写的类上使用NSCoding协议,但是似乎无法弄清楚为什么当我实现所需的方法时,编译器会抱怨它“不符合协议NSCoding”:

class ServerInfo: NSObject, NSCoding {

    var username = ""
    var password = ""
    var domain = ""
    var location = ""
    var serverFQDN = ""
    var serverID = ""

    override init() {

    }

    init(coder aDecoder: NSCoder!) {
        self.username = aDecoder.decodeObjectForKey("username") as NSString
        self.password = aDecoder.decodeObjectForKey("password") as NSString
        self.domain = aDecoder.decodeObjectForKey("domain") as NSString
        self.location = aDecoder.decodeObjectForKey("location") as NSString
        self.serverFQDN = aDecoder.decodeObjectForKey("serverFQDN") as NSString
        self.serverID = aDecoder.decodeObjectForKey("serverID") as NSString
    }


    func encodeWithCoder(_aCoder: NSCoder!) {
        _aCoder.encodeObject(self.username, forKey: "username")
        _aCoder.encodeObject(self.password, forKey: "password")
        _aCoder.encodeObject(self.domain, forKey: "domain")
        _aCoder.encodeObject(self.location, forKey: "location")
        _aCoder.encodeObject(self.serverFQDN, forKey: "serverFQDN")
        _aCoder.encodeObject(self.serverID, forKey: "serverID")
    }

}

这是一个错误还是我只是缺少一些东西?


问题答案:

如您在报告导航器中详细的编译器消息中所见,您的方法未正确声明:

错误:类型“ ServerInfo”不符合协议“ NSCoding”
ServerInfo类:NSObject,NSCoding {
^
Foundation.NSCoding:2:32:注意:协议要求函数'encodeWithCoder'类型为((NSCoder)-> Void'
  @objc(encodeWithCoder :) func encodeWithCoder(aCoder:NSCoder)
                               ^
注意:候选者的类型不匹配'(NSCoder!)->()'
    func encodeWithCoder(_aCoder:NSCoder!){
         ^
Foundation.NSCoding:3:25:注意:协议要求初始化类型为'(coder:NSCoder)'的初始化程序'init(coder :)'
  @objc(initWithCoder :) init(编码器aDecoder:NSCoder)
                        ^
注意:候选人具有不匹配的类型'(coder:NSCoder!)'
    init(coder aDecoder:NSCoder!){

(在beta版本之间可能有所变化。)此外,该initWithCoder方法必须标记为required

required init(coder aDecoder: NSCoder) {   }

func encodeWithCoder(_aCoder: NSCoder) {   }

Swift 3中 ,所需的方法是

required init(coder aDecoder: NSCoder) {   }

func encode(with aCoder: NSCoder) {   }


 类似资料:
  • 问题内容: 为什么此Swift代码无法编译? 编译器说:“类型不符合协议”(或在Swift的更高版本中,“不支持将’P’用作符合协议’P’的具体类型”。) 为什么不?某种程度上,这感觉就像是语言上的一个漏洞。我意识到问题源于将数组声明为 协议类型 的数组,但这是不合理的事情吗?我认为协议确实可以帮助提供类型分层结构之类的结构吗? 问题答案: 编辑:使用Swift还要工作18个月,Swift是另一个

  • 问题内容: 尝试符合Swift UIViewController子类中的UITableViewDataSource和UITableViewDelegate。 文件说,你应该在符合行后但那通常在超去。另一个不起作用。在超类之后使用逗号分隔的列表也不起作用 编辑: 还必须采用每种协议的所有必需方法,而我最初并未这样做。 问题答案: 您使用逗号: 但是要意识到,超类必须是逗号分隔列表中的第一项。 如果您

  • 协议(Protocols)为方法,属性和其他需求功能提供了蓝图。 它为方法或属性骨架而不是实现。 通过定义类,函数和枚举,可以进一步完成方法和属性的实现。 协议的一致性满足了协议要求的方法或属性。 语法 协议也遵循与类,结构和枚举类似的语法 - 协议在类,结构或枚举类型名称之后声明。 单个和多个协议声明也是可以的。 如果定义了多个协议,则必须用逗号分隔。 当要为超类定义协议时,协议名称应使用逗号跟

  • 协议规定了用来实现某一特定功能所必需的方法和属性。 任意能够满足协议要求的类型被称为遵循(conform)这个协议。 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。 语法 协议的语法格式如下: protocol SomeProtocol { // 协议内容 } 要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循

  • 问题内容: 编译错误如下: 类型“ AnyObject”不符合协议“ SequenceType” 这种压力是什么? 谁能帮我很多忙! 问题答案: 苹果在Swift编程语言中指出: for-in循环针对范围,序列,集合或进度中的每个项目执行一组语句。 目前,它仅符合protocol ,因此您无法在其上使用for循环。如果要这样做,则必须执行类似以下操作:

  • 问题内容: Beta 3一切正常,现在出现一个奇怪的错误,而且我不知道如何解决它。尝试了所有类似问题的解决方案。 这是我的代码: 两条标记线都给了我相同的错误: 类型“ String.Index”不符合协议“ IntegerLiteralConvertible” 有人能帮我吗?还是Beta 4有漏洞?谢谢! 问题答案: 在Beta 4中,Swift的String.Index处理再次发生了变化- 现