我已经掌握了Swift编码,但我似乎无法弄清楚这段代码有什么问题。
目标是获得一个有效的弱列表实现......
我的(显然是有缺陷的)实现总是在运行时给我一个EXC_BAD_ACCESS错误,我想它必须与swift的引用计数机制有关,但我现在已经盯着这半天了......
// a singleton test to demo the issue
class WeakListTest : SomeDelegate{
static let instance = WeakListTest()
private init(){
var delegates = WeakList<SomeDelegate>()
delegates.add(self)
delegates.foreach({(d) -> Void in
println("@@@@@@@@@@@@@@@@@@ get some value of our delegate \(d.someString)") //this gives a EXC_BAD_ACCESS (code=1, ...) runtime error
})
}
// SomeDelegate impl
var someString = "bobo"
}
protocol SomeDelegate : class {
var someString : String {get set}
}
class SomeWeakList<T:AnyObject> {
private var list = [SomeWeakWrapper<T>]()
func add(item: T){
list += [SomeWeakWrapper(inner: item)]
}
func foreach (f : (T) -> Void) {
list.map({(weakItem) -> Bool in
if let item = weakItem.inner {
println("test \(item)")
f(item)
return true
} else {
return false
}
});
}
}
class SomeWeakWrapper<T:AnyObject> {
weak private (set) var inner : T?
init(inner : T){
self.inner = inner
}
}
只需获取WeakListTest的单例实例
即可触发行为WeakListTest.instance
当你删除“弱”时,问题就会消失。来自&#39;内部&#39;的关键字SomeWeakWrapper的属性......但这显然不是一个解决方案,只是一个与引用计数有关的指标。
谢谢!