【问题标题】:Swift Generics will not instantiate generic when using inheritanceSwift 泛型在使用继承时不会实例化泛型
【发布时间】:2014-11-04 01:02:43
【问题描述】:

我有 AlphaBerry 的课程:

class Alpha { }
class Berry : Alpha { }

我有一个在其中使用继承的函数是通用的:

func myFunc<T : Alpha>(v:T) -> T {
    return T()
}

我这样调用 myFunc:

myFunc(Berry())

在我的项目中,返回的对象是Alpha 类型,而不是Berry 类型。这是编译器中的错误,还是我对泛型的误解?

【问题讨论】:

    标签: ios xcode generics swift


    【解决方案1】:

    您想要实现的是传递Berry实例 并获得Berry 的另一个实例?

    如果是这样,下面的代码应该可以工作:

    class Alpha {
    
        required init() { } // ← YOU NEED THIS
    
        func printme() {
            println("I'm alpha")
        }
    }
    class Berry : Alpha {
        override func printme() {
            println("I'm berry")
        }
    }
    
    func myFunc<T:Alpha>(v:T) -> T {
        return v.dynamicType()
    }
    // This also works:
    /*
    func myFunc<T: Alpha>(v:T) -> T {
        return (T.self as T.Type)()
    }
    */
    
    let a = myFunc(Berry())
    a.printme() // -> I'm berry
    

    required init() { } 是确保从Alpha 派生的所有类都具有init() 初始化器所必需的。 以下是相关问答:Swift generics not preserving type

    如果您想要将Berry 作为类型 传递并获取Berry 的新实例,请尝试以下操作:

    class Alpha {
        required init() { }
        func printme() {
            println("alpha")
        }
    }
    class Berry : Alpha {
        override func printme() {
            println("berry")
        }
    }
    
    func myFunc<T:Alpha>(v:T.Type) -> T {
        return v()
    }
    
    let a = myFunc(Berry)
    a.printme()
    

    【讨论】:

    • 甜,这只是节省了我几个小时的工作时间。无论如何,它更加明确和干净。
    • "这也有效:" 但不一样。第一个使用v指向的对象的运行时类;而第二个使用T,这是在编译时推断出来的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多