【问题标题】:Using guard to check parameters to inits in Swift 2.2 [closed]在 Swift 2.2 中使用警卫检查初始化参数 [关闭]
【发布时间】:2016-02-22 03:50:34
【问题描述】:

显然,一个保护语句将创建一个新变量,该变量可能会影响同名属性。

例如,在这段代码中:

struct Foo{

    let url : NSURL

    init?(urlString: String){

        guard let url = NSURL(string: urlString) else{
            return nil
        }

        //self.url = url
    }
}

只有取消最后一行的注释才能编译。否则编译器会抱怨你没有绑定 self.url。

这是错误还是功能?对我来说听起来很愚蠢,并迫使您编写重复的代码。

【问题讨论】:

  • 这是一项功能。理想情况下,您不应该使用失败的初始化程序。添加它们主要是因为 Obj-C 兼容性。更好的设计是将NSURL 直接传递给初始化程序并在初始化之前处理解析。或者使用静态方法。
  • 不只是guard,您始终可以在本地范围内创建一个变量,以隐藏在外部范围内声明的变量或属性。
  • @Sulthan 将其作为答案,我会接受。

标签: swift cocoa initialization swift2


【解决方案1】:

在离开init 方法之前,您必须初始化结构或类的所有字段。在这种情况下,你永远不会初始化 url(独立于guard 语句,所以它失败了。这个要求是为了保证对象的状态,所以销毁是可靠的,即它是语言的一个特性。

在这种情况下,guard 语句将新的 NSURL 结果分配给本地堆栈变量,而不是 url 属性,需要显式分配来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多