我在 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)
}
非常感谢指向神奇正确语法的指针。 :)
答案 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.self
从B.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;
}
。