在泛型类中传递泛型参数

Posted

技术标签:

【中文标题】在泛型类中传递泛型参数【英文标题】:Passing generic parameters in a generic class 【发布时间】:2019-05-21 17:00:26 【问题描述】:

是否有可能在 swift 中使用泛型得到类似下面的东西?任何帮助都将比其他任何事情都更重要。

class ABC 
   var title: String?


class Option: <T> 
   var name: String?
   var data: T?


let object1 = ABC()

let option = Option(name: "Test", data: object1)

// Getting data again
let data = option.data

【问题讨论】:

class Option: &lt;T&gt; 应该是class Option&lt;T&gt; @Sh_Khan:我期待的答案不在您标记为重复的示例中。事实上,下面的答案是我需要的。你能删除重复的标签吗? 【参考方案1】:

以下是在Swift 中使用Generics的方法。

protocol PPP 
    var title: String? get set


class ABC: PPP 
    var title: String?


class XYZ: PPP 
    var title: String?


class Option<T> 
    var name: String?
    var data: T?

    init(name: String?, data: T?) 
        self.name = name
        self.data = data
    


let object1 = ABC()
let option1 = Option(name: "Test1", data: object1)

let object2 = XYZ()
let option2 = Option(name: "Test2", data: object2)

由于Swift 中的classes 没有default initializer,因此创建一个接受2 个参数的String?T?

您可以使用type(of:) 方法来识别typeobject

print(type(of: option1.data)) //ABC
print(type(of: option2.data)) //XYZ

您可以在ABCXYZ 中使用protocol 访问title

使ABCXYZ 符合protocol PPP 并在ABCXYZ 中实现其title 属性。

print(option1.data?.title)
print(option2.data?.title)

【讨论】:

感谢您的回答。但我需要确定最后一行中数据的数据类型。如果没有类型转换,我该怎么做? 这是正确的,我已经知道了。我正在寻找类似的东西: option1.data.title 我可以直接访问变量而不检查其类型吗?我想这可以使用协议来完成? 也更新了。试一试。 谢谢。这是一个很好的帮助。这是否意味着我必须在 PPP 协议中声明类 ABC() 和 XYZ() 的所有变量? 没有。但反过来是true。您需要在ABCXYZ 中实现PPP 的强制variablesmethods

以上是关于在泛型类中传递泛型参数的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 在泛型类中引用应用程序委托

如何在泛型类中获取Property和Value?

在 Typescript 的泛型类中初始化泛型类型

泛型学习笔记

在泛型类中实现特定方法

泛型类中未使用的类型参数