2016-09-22 58 views
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 
}() 

如果我在第一個放置'let',編譯器會抱怨'計算屬性不允許let'。好的,有道理。第一個和第二個唯一的區別是'='和'()'。那麼,這是否意味着它不再是一個計算屬性?以下3種聲明有什麼區別?

回答

3

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

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

這是一個lazy stored property。還會分配一個返回UILabel對象的閉包。但是這個閉包在實例化過程中不會被執行。只要首次使用該屬性,它就會被執行。關閉執行後,返回的UILabel對象被分配給title

1

這是計算只得到屬性,它計算每一次當你設法得到它的值:

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

這是immidiatly初始化定期財產就地調用關閉(其中播放默認值的作用) :

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 
}() 
1

除了所有@PGDev說,我想指出的另一種方式來寫你的第二/第三聲明:

相反的:

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

你可以寫:

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

它與上面完全一樣,只是代碼寫法不同:)