5

それは私の理解です

var perhapsInt : Int?

これは自動的に.None値に設定されます。そして、以下のコードスニペットはそれを確認します(コンパイラエラーなし)

class MyClass {
    var num1: Int = 0
    var num2: Int?

    init(num1: Int) {
        self.num1 = num1
    }
}

var newClass = MyClass(num1: 5)
newClass.num1 // prints '5'
newClass.num2 // prints 'nil'

オプションの初期化プロセスに関する私の理解は正しいですか? num2もしそうなら、私がに変更したときにこれが機能しないのはなぜですかlet

nilを使用すると、オプションのデフォルトが同じ動作をすることを期待していましたlet。ここで何か不足していますか?

class MyClass {
    var num1: Int = 0
    let num2: Int?

    init(num1: Int) {
        self.num1 = num1
        // compiler error : return from initialiser without initialising all stored properties 
    }
}    
...

私の質問は、これらの両方のケースがどのように真実であるかということです。どちらかである必要はありません。オプションの値が自動的に設定される.Noneか、設定されません。

4

2 に答える 2

6

の動作は、 s が砂糖を動力源とvar num2: Int?していることが原因です。Optionalこれらは、Swift で暗黙のデフォルト値 (の.None) を持つ唯一の型です。

var num2: Int(なしで) と入力すると、 vs.?の使用に関係なく、コンパイラは同じエラーをスローすることに注意してください。varlet

class MyClass {
    var num2: Int
    init() {
        // Return from initializer without initializing all stored properties
    }
}

lets' の値は (s' とは対照的に) 上書きできないため、初期値を明示的にvar設定する必要があります。

class MyClass {
    let num2: Int? = nil
}

// or this way

class MyClass {
    let num2: Int?
    init() {
        num2 = nil
    }
}

ただし、これは役に立たないnil定数になります。


保存されたプロパティの初期化について詳しくは、こちらこちらをご覧ください。

于 2015-11-15T11:31:34.817 に答える
0

多くの議論がここにあると思います。そのスレッドからの声明 - 上記のリンクを詳しく見てください

定数の値はコンパイル時にわかっている必要はありませんが、値を 1 回だけ割り当てる必要があります。

次のように let 値を設定すると、コードがコンパイルされることに注意してください。

let num2: Int? = .None
let num2: Int? = nil
于 2015-11-15T11:25:50.360 に答える