Swift 如何解决Xcode 6.3.2中的弱引用问题?

Swift 如何解决Xcode 6.3.2中的弱引用问题?,swift,generics,weak-references,Swift,Generics,Weak References,我正在努力掌握Swift编码,但我似乎无法找出这段代码的错误。 目标是获得一个工作弱列表实现。。。 我的(明显有缺陷的)实现在运行时总是给我一个EXC_BAD_访问错误,我想这一定与swift的引用计数机制有关,但我已经盯着它看了半天了。。。 // a singleton test to demo the issue class WeakListTest : SomeDelegate{ static let instance = WeakListTest() privat

我正在努力掌握Swift编码,但我似乎无法找出这段代码的错误。 目标是获得一个工作弱列表实现。。。 我的(明显有缺陷的)实现在运行时总是给我一个EXC_BAD_访问错误,我想这一定与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
    }

}

当您从'SomeWeakWrapper'的'inner'属性中删除'weak'关键字时,问题就消失了。。。但这显然不是一个解决方案,只是一个与参考计数有关的指标


谢谢

观察:当我删除
SomeDelegate
协议并使
delegates=WeakList()
正常工作时。但我不知道为什么会有不同。似乎无法在如此(?)的网站上编辑我自己的帖子。。。因此,我将通过此评论发表更正:删除'weak'关键字解决问题的说法是错误的,问题仍然存在。。。然而,如果你删除了所有通用的东西,代码就会工作哦。。。以及示例中的另一个代码错误<代码>变量代理=WeakList()应该是
变量代理=SomeWeakList()
。。。。很抱歉。@JakubVano是的,观察得很好。。。另外,如果我使用调试器查看有问题的行(运行时错误),有趣的是dat我可以完全从调试器访问属性,而不是从代码。另一个观察结果是,在foreach循环中以闭包形式打印委托是合法的,如so
println(@@@get一些委托值\(d)”)
这表明“d”引用的对象确实正确,只是它似乎没有注意到它实现了SomeDelegate协议,因此不允许访问“someString”属性。。。我看不出这里出了什么问题。
WeakListTest.instance