我正在使用Swift 2,并使用WeakContainer作为存储一组弱对象的方法,就像
NSHashTable.weakObjectsHashTable()
struct WeakContainer<T: AnyObject> {
weak var value: T?
}
public protocol MyDelegate : AnyObject {
}
然后在我的ViewController中,声明
public var delegates = [WeakContainer<MyDelegate>]
但这是错误的
不支持将MyDelegate用作符合协议AnyObject的具体类型
我看到错误是成员WeakContainer
已value
声明为weak
,因此T
应该是对象。但是我也声明MyDelegate
为AnyObject
。如何解决这个问题?
我有相同的想法,用泛型创建弱容器。
结果,我为创建了包装器,NSHashTable
并为您的编译器错误做了一些解决方法。
class WeakSet<ObjectType>: SequenceType {
var count: Int {
return weakStorage.count
}
private let weakStorage = NSHashTable.weakObjectsHashTable()
func addObject(object: ObjectType) {
guard object is AnyObject else { fatalError("Object (\(object)) should be subclass of AnyObject") }
weakStorage.addObject(object as? AnyObject)
}
func removeObject(object: ObjectType) {
guard object is AnyObject else { fatalError("Object (\(object)) should be subclass of AnyObject") }
weakStorage.removeObject(object as? AnyObject)
}
func removeAllObjects() {
weakStorage.removeAllObjects()
}
func containsObject(object: ObjectType) -> Bool {
guard object is AnyObject else { fatalError("Object (\(object)) should be subclass of AnyObject") }
return weakStorage.containsObject(object as? AnyObject)
}
func generate() -> AnyGenerator<ObjectType> {
let enumerator = weakStorage.objectEnumerator()
return anyGenerator {
return enumerator.nextObject() as! ObjectType?
}
}
}
用法:
protocol MyDelegate : AnyObject {
func doWork()
}
class MyClass: AnyObject, MyDelegate {
fun doWork() {
// Do delegated work.
}
}
var delegates = WeakSet<MyDelegate>()
delegates.addObject(MyClass())
for delegate in delegates {
delegate.doWork()
}
这不是最佳解决方案,因为WeakSet
可以使用任何类型进行初始化,并且如果此类型不符合AnyObject
协议,则应用程序将崩溃。但是我现在没有更好的解决方案。
问题内容: 编译错误如下: 类型“ AnyObject”不符合协议“ SequenceType” 这种压力是什么? 谁能帮我很多忙! 问题答案: 苹果在Swift编程语言中指出: for-in循环针对范围,序列,集合或进度中的每个项目执行一组语句。 目前,它仅符合protocol ,因此您无法在其上使用for循环。如果要这样做,则必须执行类似以下操作:
问题内容: 我正在尝试将泛型与协议混合在一起,而xD却变得非常困难 我在Android / Java项目中实现了某些架构,并且尝试将其重写以使其适合swift / iOS项目。但是我发现了这个限制。 ProtocolA ProtocolB ImplementProtocolA ImplementProtocolB 因此,当我尝试将ProtocolB设置为实现 ProtocolA的具体类型时,出现此
问题内容: 为什么我要有一个数组并在其中放入一堆不同大小的类型… …除了和.... 文档说明: “ AnyObject可以代表任何类类型的实例” 但是,当我命令点击,或者看到这些类型的标准库定义,我看到他们都值。 这里的根本问题是什么?为什么这样设计? 问题答案: Swift中有两种类型的东西- 可以真正容纳任何东西-结构,枚举或类,以及只能容纳类。 有时似乎可以保留结构的原因是,某些特定类型会根
问题内容: Beta 3一切正常,现在出现一个奇怪的错误,而且我不知道如何解决它。尝试了所有类似问题的解决方案。 这是我的代码: 两条标记线都给了我相同的错误: 类型“ String.Index”不符合协议“ IntegerLiteralConvertible” 有人能帮我吗?还是Beta 4有漏洞?谢谢! 问题答案: 在Beta 4中,Swift的String.Index处理再次发生了变化- 现
下面的代码是TCP客户端的套接字编程示例。 但当我运行该操作时,connect()作为协议不支持的地址族返回。