首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift 4.1中迭代一组类型?

如何在Swift 4.1中迭代一组类型?
EN

Stack Overflow用户
提问于 2018-08-06 01:39:24
回答 1查看 909关注 0票数 3

我使用的是Xcode 9.4.1iOS 11.4.1上的SWIFT4.1

我有几个协议,像这样:

代码语言:javascript
复制
protocol Bla {
    // some stuff
}

protocol Gorp {
    // some other stuff
}

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

代码语言:javascript
复制
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,又符合Bla&Gorp。在这个例子中,我只是打印一个描述--就像这样:

代码语言:javascript
复制
func doSomething<T: MyType>(_ theType: T.Type) {
    // some stuff
    print("Got called... \(theType)")
}

而且,我可以调用这个函数来传递两个结构类型(Hello告别)中的每一个,如下所示:

代码语言:javascript
复制
doSomething(Hello.self)
doSomething(Goodbye.self)

这很好,我得到了如下输出,就像预期的那样:

代码语言:javascript
复制
Got called... Hello
Got called... Goodbye

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

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

代码语言:javascript
复制
for thingy in [Hello.self, Goodbye.self] {
    doSomething(thingy)
}

如果我添加了一个!MyType.Typeas!MyType,我也有同样的错误。我也试过这样做:

代码语言:javascript
复制
for thingy in [Hello.self as MyType.Type, Goodbye.self as MyType.Type]  {
    doSomething(thingy)
}

与其他错误相同。

我也尝试过没有类型的

如果我开始输入,自动完成程序会显示doSomething正在等待一个(Bla & Gorp).Protocol类型的参数。所以,我也试过这个:

代码语言:javascript
复制
for thingy in [Hello.self, Goodbye.self] as! [(Bla & Gorp).Protocol]  {
    doSomething(thingy)
}

在这种情况下,我得到了这样的信息:

代码语言:javascript
复制
In argument type '(Bla & Gorp).Protocol', 'Bla & Gorp' does not conform to expected type 'Bla'

还尝试了这种类型的东西,这会导致错误,“不能用‘(DoSomething)’类型的参数列表调用‘MyType.Type’”:

代码语言:javascript
复制
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)
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 01:52:28

您可以使doSomething方法非泛型,并接受MyType.Type。只有当您的协议没有Self或关联类型时,才能这样做。

代码语言:javascript
复制
func doSomething(_ theType: MyType.Type) {
    // some stuff
    print("Got called... \(theType)")
}

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

代码语言:javascript
复制
for thingy in [Hello.self, Goodbye.self] as [MyType.Type] {
    doSomething(thingy)
}

这利用了这样一个事实,即如果A.self从/符合B继承,那么A可以转换为B类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51699601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档