EXC_BAD_ACCESS中的Swift泛型方法

时间:2019-01-10 15:10:55

标签: swift generics

我对泛型和泛型方法一无所知。

为什么这段使用Swift泛型方法的代码在调用method1时给出EXC_BAD_ACCESS?

您可以使用Playground对其进行测试。

import UIKit
import Foundation

protocol SomeProtocol {
    func printMe()
}

class SomeClass : SomeProtocol {
    let value : String

    init(value: String) {
        self.value = value
    }
    func printMe() {
        print("\(value)")
    }
}

class BaseClass {
    func method1<T>(_ param: T) {
        print("passing into method 1 with param: \(param)")
        method2(param)
    }

    func method2<T>(_ param: T) {
    }
}

class ConcreteClass : BaseClass {

    override func method2<T>(_ param: T) where T : SomeProtocol {
        print("passing into method 2 with param: \(param.printMe())")
    }
}

let someClass = SomeClass(value: "Hi")

let obj = ConcreteClass()
obj.method1(someClass)

1 个答案:

答案 0 :(得分:2)

您已经成功地使用where闭包覆盖了该方法而没有编译错误,这一事实实际上看起来像是一个错误。 但是您的用例有一个解决方法:

class ConcreteClass : BaseClass {
    override func method2<T>(_ param: T) {
        print("Base param \(param)")
        if let printable = param as? SomeProtocol {
            printable.printMe()
        }else {
            super.method2(param)
        }
    }
}