【问题标题】:In Swift, get syntax error in convenience initializer when creating an object在 Swift 中,创建对象时在便利初始化程序中出现语法错误
【发布时间】:2015-08-18 16:35:51
【问题描述】:

我对如何使用便捷初始化器和指定初始化器有点了解。这里是一个名为ClassA的示例类

class ClassA {
    var number:Int

    convenience init(){
        self.init(newNumber: 10)
    }

    init(newNumber: Int) {
        self.number = newNumber;
    }
}

这个类运行良好,但在实现另一个名为 Base 的类时遇到了一些麻烦。代码如下:

class Base {
    var classObject:ClassA

    init(object: ClassA) {
        self.classObject = object
    }

    convenience init(){
        self.init(object: ClassA.init())
    }
}

在类Base的便利构造器中,我调用了ClassA的便利构造器,并将其作为Base的指定构造器的参数。

但是,我得到两个语法错误。

  1. 预期的成员名称或类型名称后的构造函数调用。
  2. () 不能转换为 A 类。

如果我使用

self.init(object: ClassA.init(newNumber: 10))

而不是

self.init(object: ClassA.init())

然后第一个错误消失了。 ClassA 的便捷初始化器似乎无法识别。

【问题讨论】:

  • 你的代码对我来说是完美的编译。也许您在早期版本的 Swift 中遇到了错误?更新到 Swift 2.0 并重试。投票结束是不可重现的。
  • 我使用的是 Xcode 6.4。我应该更新到 7.0 吗?
  • @matt 编译不正确。 ClassA.init() 返回无效。你应该使用ClassA()
  • 可以用 Xcode 6.4 重现的。
  • @MartinR 如果这是 Xcode 6.4 中的错误并且在 Xcode 7 中已修复,那么它是已修复的错误。 — 但是,@Roger 也是对的:显式使用 init() 应该仅限于 self.init() 之类的内容。

标签: swift class initialization convenience-methods


【解决方案1】:

尝试使用self.init(object: ClassA())

【讨论】:

  • 我不知道谁因为什么原因投了反对票。你至少应该留言吧?
  • 没关系。我以前尝试过这样做。但是为什么我的代码不起作用?如果我在 Bae 类的定义之外使用 var object = ClassA.init() 就没有错误
  • @sevenkplus 正如我在评论中所说。 ClassA.init() 返回 void 而不是对象的实例。您应该使用 ClassA()。也许你应该在 Objective-C 类中使用它,它有一个名为 init 的类方法
  • 在您的代码 ClassA.init() 返回 Void,您的 () 错误不能转换为 Class A。所以你可以在外面使用它。如果你把它打印出来println(object),你会看到神奇的
  • 这可以解释为什么我会出错。但是正如你所说,我使用两种方式在外面创建一个对象并打印出来。两个输出的格式都是 PROJECT_NAME.CLASS_NAME。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多