在Swift中使用泛型函数内的相关类型的协议

时间:2016-12-23 16:32:20

标签: swift generics swift3 swift-protocols

您好我正在尝试创建一个接受符合特定协议的泛型类型的函数,并且此协议有一个静态构建器,它返回同一个类的新实例(使用关联类型),之后他返回创建的新对象。

泛型函数将返回泛型类型的列表。

在我努力编译的过程中,我找到了一个解决方案,但我觉得自己被骗了,请看下面的代码:

import UIKit

protocol SomeRougeProtocol {
    associatedtype U

    static func convert(id: String) -> U
}

class FirstRougeClass: SomeRougeProtocol {
    typealias U = FirstRougeClass

    let value: String

    init(value: String = "") {
        self.value = value
    }

    static func convert(id: String) -> FirstRougeClass {
        return FirstRougeClass(value: id)
    }
}

class SecondRougeClass: SomeRougeProtocol {
    typealias U = SecondRougeClass

    let value: String

    init(value: String = "") {
        self.value = "special \(value)"
    }

    static func convert(id: String) -> SecondRougeClass {
        return SecondRougeClass()
    }
}


/// Takes type and generate an array from it.
func superConvert<T: SomeRougeProtocol>(class: T) -> [T.U] {
    return [T.convert(id: "1"), T.convert(id: "2"), T.convert(id: "3")]
}

// *** This is the cheasty part, I have to create a disposable object to pass as input, it won't compile otherwise.
let disposableObject = FirstRougeClass()
let a: [FirstRougeClass] = superConvert(class: disposableObject)

a[0].value // Generates "1" in the playground, success!

我的问题是,如果有更好的方法来实现我的目标吗?不使用一次性物品将是一个很大的优点哈哈

谢谢!

0 个答案:

没有答案