【问题标题】:What is the difference between passing classes as generic types or types?将类作为泛型类型或类型传递有什么区别?
【发布时间】:2021-04-14 12:02:13
【问题描述】:

在 Swift 文档中,我遇到了一段说我可以编写类型约束,如方法或协议。但是,我不明白的是这样写的好处。为什么不简单地传递类(或协议)本身?

文档:https://docs.swift.org/swift-book/LanguageGuide/Generics.html

让我用一个例子来解释。

import Foundation

class A {
    init(val: String) {
        self.val = val
    }
    let val: String
}

func someFunction<T: A>(someT: T) {
    print(someT.val)
}

func someFunction2(someT: A) {
    print(someT.val)
}

// method 1
someFunction(someT: A(val: "asdasd"))
// method 2
someFunction2(someT: A(val: "asdasd"))

在下面的sn-p中,方法一和方法二有什么区别?

【问题讨论】:

  • 不确定这是否是唯一原因,但使用 someFunction&lt;T: A&gt;(someT: T) 您可以引入通用约束,例如where T: CustomStringConvertable
  • 对我来说,泛型的优势在类/结构或具有关联类型的协议中比使用单个函数更明显。特别喜欢在这个例子中,当你对 T 有这个限制时。编辑:正如我写的那样,@NewDev 提出了一个很好的理由:)

标签: swift generics


【解决方案1】:

在您过于简化的示例中,没有太大区别。

但是,一旦您的类型约束变得更加复杂,实现所需接口的唯一方法就是通过泛型。

一个很好的例子,如果你想要一个函数接受一个输入参数,其类型是一个具有关联类型的协议,例如 SwiftUI 的View

如果您尝试使用 View 作为输入参数类型,则会收到编译时错误

func modifyView(_ view: View) {

}

Protocol 'View' 只能用作通用约束,因为它具有 Self 或关联的类型要求

但是,一旦您使 view 泛型并带有对 View 的类型约束,代码就会编译。

func modifyView<V: View>(_ view: V) {

}

您不必查看自定义函数,标准库也充满了通用函数。 JSONDecoder.decode 展示了泛型的另一个常见用例,当您希望函数根据某些输入参数返回特定类型时。这使开发人员可以只编写函数 1x,但使其适用于许多不同的类型,同时保持类型安全。

func decode<T: Decodable>(_ type: T.Type, from data: Data) throws -> T

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 2019-07-14
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多