Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中创建弱引用词典?_Ios_Xcode_Swift_Weak References - Fatal编程技术网

Ios 如何在Swift中创建弱引用词典?

Ios 如何在Swift中创建弱引用词典?,ios,xcode,swift,weak-references,Ios,Xcode,Swift,Weak References,我需要将作为视图的代理存储在字典中。现在我想将它们作为弱引用保存,因此如果用户退出屏幕,我的字典将不会阻止这些视图被清理 我试图使用以下解决方案: 但出于某种原因,当我添加一行代码试图从弱对象获取真正的委托时: if let realDelegate = delegate.value { realDelegate.updateProgressBar(Int(progress * 100), aTaskIndentifier: downloadTask.taskIdentifier) }

我需要将作为视图的代理存储在字典中。现在我想将它们作为弱引用保存,因此如果用户退出屏幕,我的字典将不会阻止这些视图被清理

我试图使用以下解决方案:

但出于某种原因,当我添加一行代码试图从弱对象获取真正的委托时:

if let realDelegate = delegate.value {
    realDelegate.updateProgressBar(Int(progress * 100), aTaskIndentifier: downloadTask.taskIdentifier)
}
我在编译时在Xcode中遇到以下错误:

命令/Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/bin/swiftc失败,退出代码为1


你知道这个解决方案有什么问题吗?或者您可以为此任务提供其他解决方案?

您可以使用
NSHashTable.weakObjectsHashTable()
而不是内置的Swift字典

您可以使用
NSHashTable.weakObjectsHashTable()
而不是内置的Swift字典

以下是我的作品:

struct WeakReference<T: AnyObject> {
    weak var value: T?
}
@objc protocol P { // Note @objc, class or AnyObject does not work
    var i: Int { get }
}
class CP: P {
    var i: Int = 0
}
let cP = CP() // Strong reference to prevent collection
let weakPD: [Int : WeakReference<P>] = [0 : WeakReference(value: cP)]
print("PD: \(weakPD[0]!.value!.i)") // 0
struct WeakReference{
弱var值:T?
}
@objc协议P{//Note@objc,class或AnyObject不起作用
变量i:Int{get}
}
类别CP:P{
变量i:Int=0
}
让cP=cP()//阻止收集的强引用
让weakPD:[Int:WeakReference

]=[0:WeakReference(value:cP)] 打印(“PD:\(weakPD[0]!.value!.i)”//0


但请注意,我必须使用@objc。

以下作品:

struct WeakReference<T: AnyObject> {
    weak var value: T?
}
@objc protocol P { // Note @objc, class or AnyObject does not work
    var i: Int { get }
}
class CP: P {
    var i: Int = 0
}
let cP = CP() // Strong reference to prevent collection
let weakPD: [Int : WeakReference<P>] = [0 : WeakReference(value: cP)]
print("PD: \(weakPD[0]!.value!.i)") // 0
struct WeakReference{
弱var值:T?
}
@objc协议P{//Note@objc,class或AnyObject不起作用
变量i:Int{get}
}
类别CP:P{
变量i:Int=0
}
让cP=cP()//阻止收集的强引用
让weakPD:[Int:WeakReference

]=[0:WeakReference(value:cP)] 打印(“PD:\(weakPD[0]!.value!.i)”//0


但请注意,我必须使用@objc。

你检查过这个吗::是的,我现在检查过了。。。但我的问题与解决方案无关,他们说要改变发布优化级别,我在调试中遇到了这个问题。此外,更改此设置对我没有任何好处。您是否检查了此::是的,我现在检查了。。。但我的问题与解决方案无关,他们说要改变发布优化级别,我在调试中遇到了这个问题。此外,更改此设置对我没有任何好处。