2016-12-29 2 views
-2

Я не знаю, почему это не работает:Пусть в качестве параметра Swift

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

} 

и в классе мой инициализации выглядит следующим образом:

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

Есть ли способ решить это. Я знаю, что в качестве параметра работает key: 123, но должно быть другое решение.

+0

Что вы пытаетесь достичь здесь? использование let в 'init' недопустимо и не нужно. По умолчанию параметры передаются как константы. Я считаю, что «inout» - единственная альтернатива –

+1

Являются ли ваши первые 2 строки кода частью другого класса? Если это так, вы не можете использовать 'self' в инициализации' class', потому что 'self' недоступен до тех пор, пока объект не будет инициализирован. – vacawama

+1

Вы можете сделать это: 'private static let key = 123', а затем' let class = Class (key: ViewController.key) '. – vacawama

ответ

2

Вы не можете использовать 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 быть доступным.

2

Если я правильно понял ваш вопрос, проблема в простоте параметров функции больше не может быть объявлена ​​let. Это изменение было частью SE-0003, которое (в принятой форме) удалило поддержку для параметров var. Поскольку параметры не могут быть объявлены var, нет особых причин, позволяющих им явно объявляться let.

Последняя принятая форма SE-0003 была анонсирована Крисом Латтнером по телефону 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

Хорошо, я удаляю 'let' в методе init, но я все еще получаю следующую ошибку: член экземпляра не может использоваться для типа« ViewController » – mafioso

+0

' ViewController' не появляется в вашем вопросе. Если вы отредактируете свой вопрос, чтобы включить свой реальный код, мы сможем оказать лучшую помощь. –

+0

В моем примере я хочу получить доступ к 'Class' из' ViewController'. Метод init находится в классе и двух строках выше в ViewController. – mafioso

Смежные вопросы