Swift 3'coding'产生'Void'(又名'()'),而不是预期的上下文结果类型XYZ?

时间:2017-01-01 10:26:23

标签: swift3 xcode8 macos-sierra

目前,我正在为我的'Note'对象编写'encode'(),为它们的序列化做准备。对于如何在Swift 3.0中进行序列化以及此错误消息的教程,我看起来很高和很低,但无济于事。

这个代码来自一个不相关的,以前的项目(从Swift 2.2转换为3.0),工作得非常好:

//Serialise the object.

    func encode(with aCoder: NSCoder)
    {
        aCoder.encodeCInt(personIDNumber, forKey: "personIDNumber")
        aCoder.encode(staffName, forKey: "staffName")
        aCoder.encode(userName, forKey: "userName")
        aCoder.encode(age, forKey: "age")
    }

但是,如果我尝试在我当前的项目(在Swift 3.0中启动)中执行相同的操作:

public func encode(with aCoder: NSCoder) 
{
    noteText = aCoder.encode(noteText, forKey: "noteText")
}

这是发生的错误:

'encode' produces 'Void' (aka '()'), not the expected contextual result type String? ***Bizzarely, this also causes every 'encode' function that's available with NSCoder-type objects to be struck-through, as though deprecated, which obviously isn't true***.

我的'decode'()如下所示,编译器很满意:

required public init (coder aDecoder: NSCoder)
    {
        noteText = aDecoder.decodeObject(forKey:  "noteText") as! String?
    }

所以,我追求的是:

•关于如何解决这个错误的一系列明确的步骤(仅仅因为我还是Swift的新手,并且我对这个消息以及追随我的人都非常感到难过)。

•解释为什么会发生这种情况,以及为什么(如果可能的话),我的'decode()'在我给出的两种情况下完全可以接受,但是'encode()'

感谢任何帮助,并提前感谢。

1 个答案:

答案 0 :(得分:0)

noteText,类encode(with:)的属性属于(Note?),属于给定类型,例如XYZencode(, forKey:)(类型aCoder)的NSCoder方法是非返回函数with signatures looking like

func encode(_ realv: Double, 
     forKey key: String)

请注意,此方法缺少显式返回类型。 not 返回类型为XYZ的值(如您所期望的那样),并且当您尝试将调用结果分配给encode(_:forKey:)属性({{1} }),您将得到预期的类型不匹配,因为noteText不是noteText类型(空元组,Void),这是没有指定返回类型的函数的默认返回。

我不知道你想在这里实现什么,但是你不能将()调用的返回分配给任何类型的属性(类型为encode(_:forKey:)的无用属性除外),因此,删除此作业将使您摆脱问题标题的错误消息。

()