【问题标题】: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:我期待的答案不在您标记为重复的示例中。事实上,下面的答案是我需要的。你能删除重复的标签吗?

标签: swift generics


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多