让在斯威夫特

问题描述:

参数

我不知道为什么不工作:让在斯威夫特

class ViewController: UIViewController { 
    private let key = 123 
    let class = Class(key: self.key) 

} 

,并在课堂上我的init看起来像这样:

init(let key: Int) { 
    self.key = key 
} 

有没有一种办法解决。我知道key: 123作为参数可行,但必须有另一种解决方案。

+0

你想在这里完成什么?在init中使用let是不允许和不必要的。参数默认作为常量传递。我相信'inout'是唯一的替代品 –

+1

您的第一个2行代码是另一个类的一部分吗?如果是这样,你不能在'class'的初始化中使用'self',因为'self'在对象初始化之前是不可用的。 – vacawama

+1

你可以这样做:'private static let key = 123',然后'let class = Class(key:ViewController.key)'。 – vacawama

你不能在一个属性的内联初始化使用self因为直到该对象已初始化self不可用。

class ViewController: UIViewController { 
    private let key = 123 
    let class = Class(key: self.key) 

} 

您可以让keystatic

class ViewController: UIViewController { 
    private static let key = 123 
    let class = Class(key: ViewController.key) 

} 

或使用lazy初始化class

class ViewController: UIViewController { 
    private let key = 123 
    lazy var class = Class(key: self.key) 

} 

这工作,因为class没有初始化,直到它被访问,并在那个时间ViewController将被初始化并且self w生病了。

如果我正确理解你的问题,问题是简单的函数参数不能再声明为let。这个改变是SE-0003的一部分,它(采用它的形式)取消了对var参数的支持。由于参数不能被声明为var,所以没有特别的理由允许它们被明确声明为let

SE-0003的最终采纳形式是由Chris Lattner在Jan 28, 2016 on the swift-evolution mailing list上发布的。下面是相关的部分,并强调说:

Parameter Lists

‘var’ in a parameter list is problematic for a number of reasons:

  • Parameter lists currently allow both “inout” and “var”, and real confusion occurs for some people learning swift that expect “var” to provide reference semantics.

  • Parameter lists are not “patterns” in the language, so neither “let” nor “var” really make sense there. Parameters were patterns in a much older swift design, but that was eliminated a long time ago and this aspect never got reconsidered.

  • “var” in a parameter list is odd because it is an implementation detail being foisted on the interface to the function. To be fair, we already have this with "API names" vs "internal names”, but this is a bigger semantic implementation detail.

Conclusion: The core team decided that we should REMOVE “var” and “let” from parameter lists.

“var” in a parameter list is convenient sugar that defines away some minor boilerplate (the shadowing copy), however, the cost benefit tradeoff doesn’t pay enough to keep it.

+0

好的,我删除了init方法中的'let',但仍然出现以下错误:实例成员无法用于类型“ViewController” – mafioso

+0

'ViewController'没有出现在您的问题中。如果您编辑您的问题以包含您的真实代码,我们可能会提供更好的帮助。 –

+0

在我的示例中,我想从'ViewController'访问'Class'。 init方法在类中,上面的两行代码在ViewController中 – mafioso