2016-12-29 7 views
-2

のパラメータとして、私は知りませんしましょう:それが機能しない理由スウィフト

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行のコードは別のクラスの一部ですか?そうであれば、 'self'はオブジェクトが初期化されるまで利用できないので' class'の初期化で 'self'を使うことはできません。 – vacawama

+1

'private static let key = 123'、' let class = Class(key:ViewController.key) 'のようにすることができます。 – vacawama

答えて

2

オブジェクトが初期化されるまでselfが利用できないので、あなたは、プロパティのインライン初期化でselfを使用することはできません。

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

} 

またはclasslazy初期設定を使用します:

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

} 

あなたはkeystatic作ることができるのいずれか

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

} 

それがアクセスされるまでclassが初期化されていないので、これは動作し、時をその時はViewControllerが初期化され、self w利用可能である。

2

あなたの質問が正しく理解されていれば、問題は単純に関数パラメータをletと宣言することができなくなります。この変更は、(採用された形式で)varパラメータのサポートを削除したSE-0003の一部です。パラメータは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メソッドはクラスの上にあり、上の2行はViewControllerにあります – mafioso

関連する問題