3
var title: UILabel {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

lazy var title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

最初に「let」を入れると、コンパイラは「計算されたプロパティでは let が許可されていません」と文句を言います。わかりました、ちょっと理にかなっています。1 番目と 2 番目の違いは、'=' と '()' だけです。では、それはもう計算されたプロパティではないということですか?

4

3 に答える 3

5

1.

var title: UILabel {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}

ですread only computed property。計算されたプロパティを にすることはできませんlet。これらは、他の保存/計算されたプロパティを使用して計算されます。そのため、独自のバッキング ストアはありません。したがって、計算されたプロパティは常に として宣言されvarます。

2.

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

ですstored property。これには、オブジェクトclosureを返すが割り当てられます。UILabelこのクロージャは、オブジェクトのインスタンス化プロセス中に実行され、返された UILabel オブジェクトが に割り当てられtitleます。

3.

lazy var title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

ですlazy stored property。オブジェクトを返すクロージャーも割り当てられUILabelます。ただし、このクロージャーは、インスタンス化プロセス中に実行されません。このプロパティが最初に使用されるたびに実行されます。クロージャの実行後、UILabel返されたオブジェクトは に割り当てられtitleます。

于 2016-09-22T10:00:53.203 に答える
2

これは計算された取得専用プロパティであり、値を取得しようとするたびに計算されます。

var title: UILabel {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}

これは、インプレースで呼び出されたクロージャー (デフォルト値の役割を果たしている) によって即時に初期化される通常のプロパティです。

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

これは遅延プロパティで、インプレースで呼び出されたクロージャによる最初のアクセスでのみ初期化されます。

lazy var title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()
于 2016-09-22T09:52:55.010 に答える
1

@PGDevが言ったことすべてに加えて、2番目/3番目の宣言を書く別の方法を指摘したいと思います:

それ以外の:

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

あなたは書ける:

let title: UILabel = {
    $0.font = .systemFontOfSize(13)
    return $0
}(UILabel())

上記とまったく同じことを行いますが、コードの書き方が異なります:)

于 2016-09-22T10:11:45.633 に答える