当前位置: 首页 > 面试题库 >

不支持使用符合协议AnyObject的具体类型

曾骁
2023-03-14
问题内容

我正在使用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的具体类型

我看到错误是成员WeakContainervalue声明为weak,因此T应该是对象。但是我也声明MyDelegateAnyObject。如何解决这个问题?


问题答案:

我有相同的想法,用泛型创建弱容器。
结果,我为创建了包装器,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()作为协议不支持的地址族返回。