這個問題在這里已經有了答案: Swift 直接定義和呼叫行內閉包 1 個回答 2天前關閉。
我在某個地方找到了這個并且一直在使用它作為我的代碼。
我不確定為什么大括號和尾隨括號。他們有必要嗎?他們在做什么?我不確定在 Swift 檔案中的哪里可以找到它。
var textField = { UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15)) }()
uj5u.com熱心網友回復:
封閉的大括號和尾隨的括號定義了一個立即呼叫的閉包,其回傳值立即分配給textField
變數。這個單行相當于寫
var textField = {
return UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15))
}()
因為閉包只包含一行,所以return
可以省略關鍵字,并且閉包被壓縮到一個信號行上。
在這種情況下,閉包的定義和呼叫是完全多余的,這相當于只寫了
var textField = UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15))
但是,這種將閉包結果分配給變數的方式是一種將跨多行創建和配置變數的結果分配給結果變數的不常見方式,例如
var textField: UITextField = {
let field = UITextField()
field.font = ...
field.textColor = ...
field.translatesAutoresizingMasksIntoConstraints = false
return field
}()
textField
如果是區域變數,這種風格也是多余的(因為您可以創建變數,然后配置它),但在為實體變數分配默認值時很常見,以便在初始化程式之外執行一致的設定和初始化。例如:
class MyComponent: UIView {
// Instance variable default values are assigned
// before initializers are called. If we assign a value here
// then we don't need to duplicate code across our inits.
var textField: UITextField = { /* some configuration */ }()
init(text: String) {
// textField is already initialized and configured.
textField.text = text
}
init(someValue: Int) {
// textField is already initialized and configured.
textField.text = someCalculationBased(on: someValue)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/485969.html