【问题标题】:Generics type constraint vs inheritance泛型类型约束与继承
【发布时间】:2015-03-26 17:12:02
【问题描述】:

这两个函数声明有区别吗?

func doSomething<T: UIViewController>(controller: T) {...}

对比

func doSomething(controller: UIViewController) {...}

Apples Swift programming language 书的类型约束语法部分,有这个代码示例:

func​ ​someFunction​<​T​: ​SomeClass​, ​U​: ​SomeProtocol​>(​someT​: ​T​, ​someU​: ​U​) {
    // function body goes here
}

有这样的描述:

上面的假设函数有两个类型参数。第一个类型参数 T 具有类型约束,要求 T 是 SomeClass 的子类。 ...

那么在哪些情况下使用上述泛型函数更好?

【问题讨论】:

    标签: ios swift generics inheritance


    【解决方案1】:

    它们是不同的,但在你使用它们的方式上,它们的结果几乎完全相同。

    不同之处在于,当您调用泛型版本时,编译器会将T 静态设置为作为参数传入的任何类型。在该参数上调用方法时,这几乎没有区别——无论哪种方式,对其方法的调用都将被动态分派,并且您不能触及不能保证从约束中可用的T 的任何部分。

    但假设您对该方法进行了更改,不仅接受一个参数,而且还 返回一个相同类型的参数:

    // T here will take the type of whatever is going in/out of the function
    // be that UIViewController or a subtype of it
    func doSomethingGenerically<T: UIViewController>(controller: T) -> T {  
        // some logic that results in a new controller being returned
    }
    
    // here the return type is fixed to be UIViewController
    func doSomethingViaBaseClass(controller: UIViewController) -> UIViewController {  
        // some logic that results in a new controller being returned
    }
    

    现在,假设您有一个 UIViewController 的子类并传入,如下所示:

    let subClass: MyUIViewController = ...
    
    let controller1 = doSomethingGenerically(subClass)
    
    let controller2 = doSomethingViaBaseClass(subClass)
    

    这里,变量controller1 的类型将是MyUIViewController,因为这是传递给函数的,所以T 就是。但是变量controller2 的类型将是UIViewController,因为这是doSomethingViaBaseClass 返回的固定类型。

    注意,这并不意味着它们引用的对象会有所不同——这取决于函数体实现的内容。只是引用它的变量的类型会改变。

    还有其他细微的差异,但这是需要了解的主要差异。然而,在结构的情况下,还有更多值得注意的差异。碰巧我昨天写了关于他们的an article,这可能会有所帮助。

    【讨论】:

    • 谢谢,我修正了错误的方法声明。所以泛型类型限制可能很有用,但在我的情况下,如果我不需要返回泛型类型,最好使用非泛型版本。
    • 是的,在引用类型的情况下,并且当您不返回 T 或类似的东西时,泛型版本不会带来任何好处,因此非泛型更好,因为它更干净.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多