2015-07-02 19 views
3

我想將對象存儲在數組中,其中對象很弱並且符合協議。但是,當我嘗試循環它,我得到一個編譯錯誤:迭代弱引用數組,其中的對象符合Swift中的協議

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

任何想法到底是什麼?

Bitcast requires types of same width %.asSubstituted = bitcast i64 %35 to i128, !dbg !5442 LLVM ERROR: Broken function found, compilation aborted!

enter image description here enter image description here enter image description here

回答

2

泛型不這樣做的,你似乎想象的方式解決他們的類型的協議繼承。你的Weak<ClassWithReloadFRC>類型通常是無用的。例如,你不能創建一個,更不用說加載它們的一個數組。

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 

我想先問問自己的事情是,你是什麼真正嘗試做的。例如,如果你在一個弱引用對象的數組之後,有內置的Cocoa方法來做到這一點。

+1

我應該補充說,一般來說,我有一個可怕的時間與數組<協議類型>,所以我希望數組<通用<協議類型>更糟糕。 :) – matt

+0

「有內置的可可方法來做到這一點」 - 他們只在Objective-C中工作。如果你嘗試使用'NSHashTable'或類似的東西,你會得到與'Weak'包裝器一樣的作者的錯誤。 – kelin

1

我在Xcode 6.4中看到類似的編譯器錯誤。我需要一系列弱協議來存儲視圖控制器的多個委託。基於對我發現的類似問題的回答,我使用了NSHashtable而不是快速數組。

private var _delegates = NSHashTable.weakObjectsHashTable() 
1

我認爲有一個編譯器限制/錯誤。如果您標記您的協議作爲@objc它會工作,如:

// 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 

這是煩人,你必須使用@objc,因此不是一個純粹的迅速解決,但由於我在iOS上不是我的問題。

相關問題