【问题标题】:Switching on a generic type?开启泛型类型?
【发布时间】:2015-10-18 21:52:18
【问题描述】:

是否可以在 Swift 中开启泛型类型?

这是我的意思的一个例子:

func doSomething<T>(type: T.Type) {
    switch type {
    case String.Type:
        // Do something
        break;
    case Int.Type:
        // Do something
        break;
    default:
        // Do something
        break;
    }
}

尝试使用上面的代码时,我收到以下错误:

Binary operator '~=' cannot be applied to operands of type 'String.Type.Type' and 'T.Type'
Binary operator '~=' cannot be applied to operands of type 'Int.Type.Type' and 'T.Type'

有没有办法打开一个类型,或者实现类似的东西? (使用泛型调用方法并根据泛型的类型执行不同的操作)

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    您需要is 模式:

    func doSomething<T>(type: T.Type) {
        switch type {
        case is String.Type:
            print("It's a String")
        case is Int.Type:
            print("It's an Int")
        default:
            print("Wot?")
        }
    }
    

    注意break 语句通常不需要,没有 Swift 案例中的“默认失败”。

    【讨论】:

    • 我在使用switch type 时收到一个奇怪的警告,但是switch T.self 可以正常工作。谢谢!
    • @jackwilsdon:奇怪,我在 Xcode 7.0.1 中测试过,没有收到任何警告。
    • 我正在使用游乐场,但是在重新加载游乐场后,警告消失了。谢谢!
    • @jackwilsdon:我个人的经验是 Playground 非常适合使用 working 代码。如果发生任何“意外”,切换到已编译的项目,编译器诊断和调试工具会更好。
    • 那么当您尝试分配tintColor(即UIButton)时如何解决这个问题?这使得T 成为ImplicitlyUnwrappedOptional&lt;UIColor&gt;,如何检查这些?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多