我的类中有一个可选元组的计算属性:
var contents: (Int, Bool)?
我想编写一个自定义setter但不知道如何单独引用元组组件。有谁知道?我尝试了以下但是它不起作用:
var contents: (Int colorNumber, Bool selected)? {
// getter & setter here...
}
答案 0 :(得分:4)
使用let来分解元组
var iVal:Int?
var bVal:Bool?
var contents:(Int, Bool)? {
get {
if iVal != nil && bVal != nil {
return (iVal!, bVal!)
}
else {
return nil
}
}
set {
if newValue != nil {
let (i, b) = newValue! // decompose the tuple
iVal = i
bVal = b
}
else {
iVal = nil
bVal = nil
}
}
}
答案 1 :(得分:3)
您必须明确实施set
和get
。在setter中,您可以使用newValue
隐式参数访问新值。
假设您的元组由各个数据成员支持,那么您将按如下方式实现该属性:
var colorNumber: Int?
var selected: Bool?
var contents: (Int, Bool)? {
get {
if self.colorNumber != nil && self.selected != nil {
return (self.colorNumber!, self.selected!)
}
return nil
}
set {
if let value = newValue {
colorNumber = value.0
selected = value.1
}
}
}
您还可以使用命名参数:
var colorNumber: Int?
var selected: Bool?
var contents: (colorNumber: Int, selected: Bool)? {
get {
if self.colorNumber != nil && self.selected != nil {
return (self.colorNumber!, self.selected!)
}
return nil
}
set {
if let value = newValue {
colorNumber = value.colorNumber
selected = value.selected
}
}
}