【问题标题】:cannot specialize a non-generic definition不能专门化非通用定义
【发布时间】:2020-07-28 19:10:13
【问题描述】:

我已经尝试关注Cannot explicitly specialize a generic function,但我无法掌握这个

这是我的代码

class A<T>{
    func test(){
        self.verify(value : T.self)
    }
    
    func verify<T>(value: T) {
        print("Default")
    }
}

extension A where T == String {
    func verify<T>(value: T){
        print("Str")
    }
}



let o = A<String>()
o.test()

测试是唯一可以调用的可用函数。当我执行这个时,我得到 默认不是 Str。

但是根据泛型,我应该得到 Str.我在这里做错了什么?如果 T == String

,我应该怎么做才能保持扩展 A 给我 Str

【问题讨论】:

  • func verify&lt;T&gt;(value: T)verify方法的泛型类型T与类泛型T没有关系
  • 在你的课堂上,你说 T 在第一个验证函数中可以是任何东西,并且 String 符合该要求。目前尚不清楚您要在这里做什么。
  • 我想在test里面调用verify,希望根据T的类型,去对应的静态分派的verify声明。但事实并非如此。我如何在测试中调用验证并适当地对待 T

标签: ios swift xcode generics


【解决方案1】:

好的,所以我在这里学习新的泛型。这就是我得到的,

class A<T>{
     func test(){
        print("Def Test")
     
        verifyVal()
    }
    
    func verify() {
        print("Default verifyVal")
    }
}

extension A where T == String {
    func test(){
        print("String")
    }
}
extension A where T == Int {
    func test(){
        print("Int")
    }
}



let o = A<String>()
o.test()

let a = A<Int>()
a.test()

这会给你预期的结果

String
Int

所以基本上重载测试方法而不是验证。 但是,有一些警告

  1. 如果方法测试是从另一个类继承的,比如 A 是最初编写方法测试的 N 的子类,则无法在扩展中覆盖它。

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多