【问题标题】:Extra argument in call in self.init Swift 2.2self.init Swift 2.2 中调用的额外参数
【发布时间】:2016-06-04 15:34:22
【问题描述】:

我一直在寻找这个错误并阅读各种 stackoverflow、Apple 文档和博客答案,但我仍然遇到问题。我有一个符合 NSData 和 NSCoding 的类,将存储 6 个属性中的 3 个。在所需的便利 init 中调用 self.init 时,我收到错误“调用中的额外参数 'groomedStatus'”,即使 self.init 签名与 init 完全匹配(我复制并粘贴)。这是相关代码:

class Trail: NSObject, NSCoding {
var name: String
var difficulty: Difficulty
var haveSkied: Bool
var season: Season = .winter
var open: String?
var groomedStatus: String?

init(name: String, difficulty: Difficulty, haveSkied: Bool, season: Season, open: String?, groomedStatus: String?) {
    self.name = name
    self.difficulty = difficulty
    self.haveSkied = haveSkied
    self.season = season
    self.open = open
    self.groomedStatus = groomedStatus
}

required convenience init(coder aDecoder: NSCoder) {

    let haveSkied = aDecoder.decodeObjectForKey("haveSkied") as! Bool
    let open = aDecoder.decodeObjectForKey("open") as? String
    let groomedStatus = aDecoder.decodeObjectForKey("groomedStatus") as? String


    self.init(name: String, difficulty: Difficulty, haveSkied: Bool, season: Season, open: String?, groomedStatus: String?) {
        self.name = name
        self.difficulty = difficulty
        self.haveSkied = haveSkied
        self.season = season
        self.open = open
        self.groomedStatus = groomedStatus
    }

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeBool(haveSkied, forKey: "haveSkied")
    aCoder.encodeObject(open, forKey: "open")
    aCoder.encodeObject(groomedStatus, forKey: "groomedStatus")
}

}

【问题讨论】:

  • 我不确定?这是一个编译器错误,所以我没有从模拟器中卸载并重新安装应用程序,并且我在更改后尝试了几次Command B构建它。
  • 啊,这只是我尝试的一些愚蠢的事情,因为我已经没有想法了。我会把它改回原来的。
  • 错误信息有点误导。问题在于init(coder... 方法中的嵌套init 定义。那根本行不通。例如,您必须为name 传递一个真实的字符串,而不是String 类型。

标签: swift2 nsdata nscoding


【解决方案1】:

问题是由您如何调用self.init() 引起的。您在代码中执行此操作的方式本质上是尝试重新定义它,这对编译器没有意义。这就是您应该在便利初始化程序中调用 self.init() 的方式。

self.init(name: "yourActualNameString", difficulty: Difficulty(), haveSkied: true, season: .winter, open: "yourActualOpenString", groomedStatus: "yourActualGroomedStatusString")

【讨论】:

  • 成功了,谢谢!我使用 encodeObject 保存了类的每个属性,并使用 decodeObjectForKey 将实际值传递给 self.init。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2015-09-13
  • 2018-08-26
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多