首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift通用参考类型

Swift通用参考类型
EN

Stack Overflow用户
提问于 2016-11-30 20:48:26
回答 2查看 586关注 0票数 4

我遇到了一些问题,试图将泛型类型需求限制为仅引用类型。下面是一些示例代码:

代码语言:javascript
复制
class WeakHolder<Element: AnyObject> {
    weak var element: Element?

    init(element: Element) {
        self.element = element
    }
}

protocol Animal: class { }

class Dog: Animal { }

let dog: Animal = Dog()
let holder = WeakHolder<Animal>(element: dog) // Error: Using "Animal" as a concrete type conforming to protocol 'AnyObject' is not supported.

如果将泛型需求更改为<Element: class>,则会得到错误class constraint can only appear on protocol declarations

这是仿制药的限制吗?将协议标记为类就足以有对该协议的弱引用,在泛型中没有等效的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-01 00:56:49

简单的答案是,您不能有一个通用类型的协议。

写出语法可以清楚地说明这是如何工作的:class/struct GenericType<TypeName: TypeConstraints> {}

let thing = GenericType<Type>() where Type is a class or struct that adheres to any constraints

要求采用类型为类的协议意味着任何采用者都是类,但协议本身仍然不是类型。

泛型可能在某种程度上支持协议,但需要更改协议或泛型的一般方法。虽然您的具体示例可能需要少量的幕后工作,但是这可能会在某个时候实现。

如果你想看泛论宣言的方向,你可以看一看。浏览一下它,我没有发现任何与您的用例直接相关的东西,但是它是相当具体的,所以它可能不会包含在文档的参数中。

票数 0
EN

Stack Overflow用户

发布于 2016-12-01 15:37:28

在我的特殊情况下有效的另一个解决方案是:

代码语言:javascript
复制
class WeakHolder<Element: AnyObject> {
    weak var element: Element?

    init(element: Element) {
        self.element = element
    }
}

protocol Animal: class { }

class Dog: Animal { }

let dog: Animal = Dog()
let holder = WeakHolder<AnyObject>(element: dog as AnyObject)

当访问元素时,我只需要执行一个向下转换回到我的协议。当然,在使用此类具有值类型时,我将失去编译时间安全性,但在我的情况下,这不是一个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40897924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档