簡體   English   中英

迭代對象符合Swift協議的弱引用數組

[英]Iterate array of weak references where objects conform to a protocol in 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需要相同寬度%的類型.asSubstituted = bitcast i64%35到i128,!dbg!5442 LLVM ERROR:找到破碎的功能,編譯中止!

在此輸入圖像描述在此輸入圖像描述在此輸入圖像描述

我認為存在編譯器限制/錯誤。 如果您將協議標記為@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而不是純粹的Swift解決方案,但因為我在iOS上對我來說不是問題。

泛型不會以您想象的方式執行其解析類型的協議繼承。 你的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方法可以做到這一點。

我在Xcode 6.4中看到了類似的編譯器錯誤。 我需要一組弱協議來為視圖控制器存儲多個委托。 根據我發現的類似問題的答案,我使用了NSHashtable而不是swift數組。

private var _delegates = NSHashTable.weakObjectsHashTable()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM