如何将计算属性添加到Array <t>?

时间:2015-07-04 04:45:49

标签: ios arrays swift generics

我有:

var _feedbacks: [feedBack]!

我想在[feedBack]中添加一个属性,以便我可以说:

var _ID = _feedBacks.ID 

我试过了:

extension Array {   
    var ID: String {        
        get { 
            return self.ID
        }

        set {
            self.ID = newValue
        }
    }
}

但是当我尝试设置/获取"EXC_BAD_ACCESS"

时,编译器会抛出ID

我也尝试过:

import ObjectiveC

private var arrayAssocationKey: Void?

extension Array {
    var ID: String {
        get {
            return objc_getAssociatedObject(self, &arrayAssocationKey) as? String
        }
        set {
            objc_setAssociatedObject(self, &arrayAssocationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
        }
    }
}

但编译器调用错误`Array不符合协议AnyObject

是否有解决方法来设置此属性?

2 个答案:

答案 0 :(得分:1)

扩展所有数组以添加ID属性似乎有点矫枉过正。我认为你最好创建一个包含ID和一系列反馈的类,如下所示:

    class feedbackCollection {
        var ID: String?
        var feedbacks: [feedback]?
    }

修改

对此解决方案的更通用尝试可能对您有用:

class IDArray<T> {
    var ID: String
    var items: [T]
    init(ID: String, items: [T]) {
        self.ID = ID
        self.items = items
    }
}

它会像这样使用:

let ints = IDArray(ID: "1", items: [1, 2, 4])

let strings = IDArray(ID: "2", items: ["test", "this", "thing"])

strings.ID = "8"
strings.items.append("more")

答案 1 :(得分:0)

您要做的是添加存储的属性,无论是使用计算属性访问还是直接公开。

getBaseContext属性是您要添加到ID类型的新变量,但这是不可能的。数组,以及任何其他类,结构和枚举,在主声明中定义它们的存储属性(不在扩展中),这样就可以在编译时确定该类实例占用的内存大小/结构/枚举。

使用扩展名添加存储属性是不可能的,因为这会改变内存大小 - 其他属性会增加更多字节。问题是扩展可以在某些地方可见(例如,在框架中),但在其他地方不可见(例如,在另一个框架中) - 当跨越不同的边界使用时,使数组与自身不兼容。

计算出的属性变体:

Array

无法工作:它在getter和setter实现中以递归方式引用自身(参见this answer

我从未使用过相关对象(更多是出于哲学原因:如果我使用它,听起来我的代码设计很糟糕),但我认为应该按如下方式使用:

extension Array {   
    var ID: String {        
        get { 
            return self.ID
        }

        set {
            self.ID = newValue
        }
    }
}