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

Posted

技术标签:

【中文标题】元组属性的自定义设置器(Swift)【英文标题】:Custom setter for tuple property (Swift) 【发布时间】:2014-09-18 15:44:42 【问题描述】:

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

var contents: (Int, Bool)?

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您必须明确实现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
        
    

【讨论】:

似乎这些被称为“未命名元组”和“命名元组”(如此处所示:raywenderlich.com/75289/…)但苹果只是称它们为......嗯,一点也不。无论如何,这很棒,分解答案(上图)也很棒。

以上是关于元组属性的自定义设置器(Swift)的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 自定义组件,拖动时无法在设计器中定位(顶部/左侧属性的自定义设置器)

来自 xaml 的自定义渲染器的 Xamarin 访问属性

类别中的自定义 NSManagedObject 设置器

double 的自定义设置器

使用 SpriteKit 和 Swift 的自定义着色器有一些不同

在符合 UIApperance 的自定义类中允许哪些 Swift 属性类型?