为什么必须初始化闭包作为可选的存储属性?

时间:2016-01-20 02:22:50

标签: swift closures optional

在Swift中,我可以声明任何类型的存储属性,如:

class MyClass {
  let foo : AnyObject
}
然后,Swift会抱怨MyClass没有初始化程序。我在这里有几个选择:

// 1. Assign a default value to `foo`, like so:

class MyClass {
  let foo : AnyObject = "bar"
}

// 2. Create an initializer, 
//    which assigns a default value to `foo` before returning.

class MyClass {
  let foo : AnyObject

  init() {
     foo = "bar"
  }
}

 // 3. Make `foo` into an optional, 
 //    which changes its type, but removes the 
 //    requirement for a default value. 

class MyClass {
  let foo : AnyObject?
}

但是,如果我将foo置于闭包中,则选项3不再有效。例如,考虑一下:

class MyClass {
  let foo : ((bar : AnyObject)-> Void)
}

此代码示例导致编译器抱怨:

  

MyClass没有初始值设定项。    - Swift 2.1编译器

这是合理的,所以让我们尝试不同的解决方案:

class MyClass {
  let foo : ((bar : AnyObject)-> Void) = {() -> Void in }
}

这很有效,因为我们已经分配了一个默认值。但这可能不是我想要的。我们可以将默认值更改为nil,但前提是我们将该属性设置为Optional。我们试试吧:

class MyClass {
  let foo : ((bar : AnyObject)-> Void)? = nil
}

这样可行,但如果我们要删除= nil部分呢?

class MyClass {
  let foo : ((bar : AnyObject)-> Void)?
}

编译器抛出与以前相同的错误!为什么?即使没有默认值,也不应该使我的属性可选足够吗?

0 个答案:

没有答案