【发布时间】:2017-09-23 15:58:18
【问题描述】:
我想从作为参数传递给函数的数组中提取类型,以使类型参数可选。
init(type: ContentType? = nil, style: LayoutStyle, content: [ContentProtocol]) {
self.type = type ?? {
switch content {
case is [Ad]: return .ads
case is [User]: return .users
case is [List]: return .list
default: fatalError("Can't assume.")
}
}()
}
Ad、User 和 List 都符合 ContentProtocol。
这些 switch 语句会导致错误,"Optional type '[Ad/User/List]' cannot be used as a boolean; test for '!= nil' instead",这不是我想要做的。
然而,这个初始化确实有效。
init(type: ContentType? = nil, style: LayoutStyle, fetcher: ContentFetcher) {
self.type = type ?? {
switch fetcher {
case is AdFetcher: return .ads
case is UserFetcher: return .users
case is ListFetcher: return .list
default: fatalError("Can't assume.")
}
}()
}
ContentFetcher是另外一个协议,switch语句中的所有类型都符合这个。
第一个 init 可以达到与最后一个 init 相同的效果吗?
【问题讨论】:
-
类似问题(可能的解决方法):stackoverflow.com/questions/24355513/…,Swift 错误报告:bugs.swift.org/browse/SR-5671
-
我有一个关于你的代码的问题,我想知道如果它最初是 nil 并且你总是根据相同的另一个参数设置它的值,你为什么要在你的 init 中添加“type”参数init ("fetcher") ?
-
@Alex 我只是在滥用可选参数来拥有一个 init,如果我想强制它成为不同于 init 通常假设的东西,我可以使用显式类型调用它。此外,如果您不指定类型,它只会设置要从 content 参数假定的类型。