使用guard检查Swift 2.2中初始化的参数

使用guard检查Swift 2.2中初始化的参数,swift,cocoa,initialization,swift2,Swift,Cocoa,Initialization,Swift2,显然,guard语句将创建一个新变量,该变量可能会对具有相同名称的属性进行阴影处理 例如,在此代码中: struct Foo{ let url : NSURL init?(urlString: String){ guard let url = NSURL(string: urlString) else{ return nil } //self.url = url } } 只有取消最后一行的注

显然,guard语句将创建一个新变量,该变量可能会对具有相同名称的属性进行阴影处理

例如,在此代码中:

struct Foo{

    let url : NSURL

    init?(urlString: String){

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

        //self.url = url
    }
}
只有取消最后一行的注释,它才会编译。否则,编译器将抱怨您未绑定self.url


这是一个bug还是一个特性?在我看来,这听起来很愚蠢,而且会迫使您编写重复的代码。

在离开
init
方法之前,必须初始化结构或类的所有字段。在这种情况下,您永远不会初始化url(独立于
guard
语句),因此它会失败。这一要求是为了保证对象的状态,因此销毁是可靠的,也就是说,它是该语言的一项功能


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

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


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

这是一个特性。理想情况下,您不应该使用失败的初始值设定项。添加它们主要是因为Obj-C兼容性。打赌第三种设计是将
NSURL
直接传递给初始值设定项,并在初始化之前处理解析。或者使用静态方法。这不仅仅是
guard
,您始终可以在局部范围内创建一个变量,该变量会隐藏在外部范围内声明的变量或属性。@Sulthan回答这个问题,我会接受它。这是一个功能。理想情况下,您不应该使用失败的初始值设定项。添加它们主要是因为Obj-C兼容性。更好的设计是将
NSURL
直接传递给初始值设定项,并在初始化之前处理解析。或者使用静态方法。这不仅仅是
guard
,您始终可以在本地sc中创建变量隐藏在外部作用域中声明的变量或属性的作用域。@Sulthan回答这个问题,我就接受它。