Arreglo iterativo de references débiles donde los objects se ajustan a un protocolo en Swift

Quiero almacenar objects en una matriz, donde los objects son débiles y se ajusta a un protocolo. Pero cuando trato de hacerlo, obtengo un error de compilation:

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

 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() } 

¿Alguna idea de qué diablos?

Bitcast requiere types de la misma anchura% .asSubstituted = bitcast i64% 35 a i128,! Dbg! 5442 LLVM ERROR: Se ha encontrado una function rota, ¡se ha abortado la compilation!

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

Los generics no hacen inheritance de protocolo de su tipo de resolución de la forma en que parecen imaginar. Su tipo Weak<ClassWithReloadFRC> generalmente será inútil. Por ejemplo, no puede crear una, y mucho less cargar una matriz de ellas.

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

Creo que lo que te estás preguntando es lo que realmente intentas hacer. Por ejemplo, si está buscando una serie de objects con poca reference, hay forms incorporadas de Cocoa para hacerlo.

Estaba viendo un error de comstackdor similar en Xcode 6.4. Necesitaba una variedad de protocolos débiles para almacenar múltiples delegates para un controller de vista. Sobre la base de una respuesta a una pregunta similar que encontré, utilicé una NSHashtable en lugar de una matriz rápida.

 private var _delegates = NSHashTable.weakObjectsHashTable() 

Creo que hay una limitación / error del comstackdor. Si marca su protocolo como @objc, funcionará, por ejemplo:

 // Array of weak references of a protocol OK so long as protocol marked @objc struct WeakReference<T: AnyObject> { 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<P>] = [WeakReference(value: cP)] // Note typed as `[WeakReference<P>]` print("P: \(weakPs[0].value!.i)") // 0 

Es molesto que tengas que usar @objc y, por lo tanto, no una solución Swift pura, pero como estoy en iOS no es un problema para mí.