基于类的Swift常量是否强制为可选

时间:2014-11-27 12:05:07

标签: ios swift xcode macos

我对Swift开发很新,所以如果这是一个非常愚蠢的问题而道歉 - 阅读了Apple的指南,我对我遇到的行为感到惊讶(并且有点恼火)。

我正在创建一个非常简单的类,它在类的开头定义了许多未初始化的常量。初始化类时,将设置值。似乎我不能这样做,除非我声明常量是可选的,即使它们不是可选的并且都在构造函数中设置。例如:

class TestClass {
    private let urlAddress:String

    init(urlAddress: String) {
        self.urlAddress = getUrlAddressWithProto("http", urlAddress:urlAddress)
    }

    func getUrlAddressWithProto(proto: String, urlAddress:String) -> String {
        return "\(proto)://\(urlAddress)/"
    }
}

函数getUrlAddressWithProto返回一个非可选的String但Xcode会抛出错误:     错误:变量' self.urlAddress'在初始化之前使用

有没有人首先想到为什么会出现这种情况,以及是否有合适的替代方法来宣布我的所有常量都是可选的?

1 个答案:

答案 0 :(得分:3)

编译器可能想告诉您在初始化所有非可选变量之前不允许调用该函数。有时错误消息不是很明显。

Swift阻止使用处于不一致状态的实例。 Swift不知道您调用的函数不依赖于内部状态,因此您无法在init完成之前调用实例函数。

除了将变量标记为可选之外,您还有几个选项。

  • 将该功能转换为类功能。由于类函数未绑定到实例,因此可以在实例的init完成之前调用它们
  • 将代码从函数移动到初始化程序
  • 将变量转换为隐式展开的可选项。 (即let urlAddress: String!)。您可以将该变量用作非可选变量。只需确保在init期间设置它。如果你使用它做什么,它是零,程序将中止。

根据您的真实代码,最后一个可能是唯一可行的选项。