Ios 元组属性的自定义设置器(Swift)

Ios 元组属性的自定义设置器(Swift),ios,iphone,cocoa,cocoa-touch,swift,Ios,Iphone,Cocoa,Cocoa Touch,Swift,我的类中有一个computed属性,它是可选的元组: var contents: (Int, Bool)? 我想编写一个自定义setter,但不知道如何单独引用元组组件。有人知道吗?我尝试了以下方法,但无效: var contents: (Int colorNumber, Bool selected)? { // getter & setter here... } 使用let分解元组 var iVal:Int? var bVal:Bool? var contents:(In

我的类中有一个computed属性,它是可选的元组:

var contents: (Int, Bool)?
我想编写一个自定义setter,但不知道如何单独引用元组组件。有人知道吗?我尝试了以下方法,但无效:

var contents: (Int colorNumber, Bool selected)? {
    // getter & setter here...
}

使用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
        }
    }
}

您必须显式地实现
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
        }
    }
}
看起来这些被称为“未命名的元组”和“命名的元组”(如图所示),但苹果只是称它们为。。。嗯,一点也不多。无论如何,这很好,分解答案(上面)也很好。