迭代对象符合Swift协议的弱引用数组

我想将对象存储在数组中,对象很弱,并且符合协议。 但是当我尝试循环它时,我得到一个编译器错误:

public class Weak { public weak var value : T? public init (value: T) { self.value = value } } public protocol ClassWithReloadFRC: class { func reloadFRC() } public var objectWithReloadFRC = [Weak]() 

 for owrfrc in objectWithReloadFRC { //If I comment this line here, it will able to compile. //if not I get error see below owrfrc.value!.reloadFRC() } 

知道到底是什么?

Bitcast需要相同宽度%的类型.asSubstituted = bitcast i64%35到i128,!dbg!5442 LLVM ERROR:发现function损坏,编译中止!

在此处输入图像描述在此处输入图像描述在此处输入图像描述

generics不会以您想象的方式执行其解析类型的协议inheritance。 你的Weak类型通常是无用的。 例如,你不能创建一个,更不用说加载它们的数组了。

 class Thing : ClassWithReloadFRC { func reloadFRC(){} } let weaky = Weak(value:Thing()) // so far so good; it's a Weak let weaky2 = weaky as Weak // compile error 

我认为要问自己的是你真正想要做的事情。 例如,如果您在一组弱引用对象之后,有内置的Cocoa方法可以做到这一点。

我认为存在编译器限制/错误。 如果您将协议标记为@objc,它将起作用,例如:

 // Array of weak references of a protocol OK so long as protocol marked @objc struct WeakReference { weak var value: T? } @objc protocol P { // Note @objc, class or AnyObject won't work var i: Int { get } } class CP: P { var i: Int = 0 } let cP = CP() // Strong reference to prevent collection let weakPs: [WeakReference

] = [WeakReference(value: cP)] // Note typed as `[WeakReference

]` print("P: \(weakPs[0].value!.i)") // 0

令人讨厌的是你必须使用@objc而不是纯粹的Swift解决方案,但因为我在iOS上对我来说不是问题。

我在Xcode 6.4中看到了类似的编译器错误。 我需要一组弱协议来为视图控制器存储多个委托。 根据我发现的类似问题的答案,我使用了NSHashtable而不是swift数组。

 private var _delegates = NSHashTable.weakObjectsHashTable()