var _feedbacks: [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
是否有解决方法来设置此属性?
答案 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
}
}
}