如何在Swift 4.1中迭代一系列类型?

时间:2018-08-06 01:39:24

标签: swift conditional protocols

我在 iOS 11.4.1 上将 Xcode 9.4.1 Swift 4.1 结合使用。

我有一些协议,例如:

protocol Bla {
    // some stuff
}

protocol Gorp {
    // some other stuff
}

我有一些符合这两个协议的结构,例如:

typealias MyType = Bla & Gorp

struct Hello: MyType {
    var ID: Int
    var name: String
}

struct Goodbye: MyType {
    var percentage: Double
    var hairbrush: String
}

然后我有一个函数,该函数带有一个参数 theType ,该参数同时符合 Bla&Gorp 。在此示例中,我仅打印说明-像这样:

func doSomething<T: MyType>(_ theType: T.Type) {
    // some stuff
    print("Got called... \(theType)")
}

而且,我可以通过两个结构类型(你好再见)来调用此函数,如下所示:

doSomething(Hello.self)
doSomething(Goodbye.self)

这很好用,并且我得到了预期的输出:

Got called... Hello
Got called... Goodbye

但是,我真正想做的是迭代一堆,而不是单独调用它们。

这种方式给我一个错误“ 注意:期望类型为'(T.Type)'的参数列表”:

for thingy in [Hello.self, Goodbye.self] {
    doSomething(thingy)
}

如果我添加为! [MyType.Type] 为! [MyType] ,出现相同的错误。我也尝试过:

for thingy in [Hello.self as MyType.Type, Goodbye.self as MyType.Type]  {
    doSomething(thingy)
}

与其余错误相同。

我也尝试过没有 typealias

如果我开始输入内容,则自动完成功能会显示 doSomething 需要一个类型为(Bla&Gorp).Protocol 的参数。所以,我也尝试过:

for thingy in [Hello.self, Goodbye.self] as! [(Bla & Gorp).Protocol]  {
    doSomething(thingy)
}

在这种情况下,我收到消息:

In argument type '(Bla & Gorp).Protocol', 'Bla & Gorp' does not conform to expected type 'Bla'

也尝试了这种事情,这给出了一个错误,“ 无法使用类型为((MyType.Type)'的参数列表调用'doSomething'”:

struct AnyBlaGorp {
    let blaGorp: MyType.Type

    init<T: MyType>(_ theType: T.Type) {
        self.blaGorp = theType
    }
}

for thingy in [AnyBlaGorp(Hello.self), AnyBlaGorp(Goodbye.self)]  {
    doSomething(thingy.blaGorp)
}

非常感谢指向神奇正确语法的指针。 :)

1 个答案:

答案 0 :(得分:3)

您可以将doSomething方法设为非泛型并接受MyType.Type。只有在您的协议没有Self或相关类型的情况下,您才能这样做。

func doSomething(_ theType: MyType.Type) {
    // some stuff
    print("Got called... \(theType)")
}

接下来,将数组转换为[MyType.Type]

for thingy in [Hello.self, Goodbye.self] as [MyType.Type] {
    doSomething(thingy)
}

这利用了以下事实:如果A.selfB.Type继承/符合A,则B可以转换为类型public double calculate(int size, int count) { int match; match = 0; //Create the birthday array int[] birthdays; birthdays = new int[size]; for(int z = 0; z < count; z++){ //Populate the birthday array with random birthdays Random rand = new Random(); rand.setSeed(count); for (int x = 0; x < size; x++) { //Create random number birthdays[x] = rand.nextInt(365); } //Create 2 loops to seek for duplicates for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { if ((birthdays[i] == birthdays[j]) && (i != j)) { match = match + 1; break; } } } } return match; }