用于元组属性的自定义setter(Swift)

时间:2014-09-18 15:44:43

标签: ios iphone cocoa cocoa-touch swift

我的类中有一个可选元组的计算属性:

var contents: (Int, Bool)?

我想编写一个自定义setter但不知道如何单独引用元组组件。有谁知道?我尝试了以下但是它不起作用:

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

2 个答案:

答案 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)

您必须明确实施setget。在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
        }
    }
}
相关问题