【发布时间】:2017-06-23 05:20:13
【问题描述】:
我对 Xcode 抛出的这个错误感到非常困惑。它说Switch statement must be exhaustive。但是,我 100% 肯定我正在处理所有案件。
这是我的代码:
enum Search: Endpoint {
case sets(query: String?, creator: String?, imagesOnly: Bool?, autocomplete: Bool?, modifiedSince: TimeInterval?, page: Int?, perPage: Int?)
case classes(query: String, page: Int?, perPage: Int?)
case universal(query: String, page: Int?, perPage: Int?)
public var baseURL: String { return QuizletEndpoint.baseURL }
public var version: Float { return QuizletEndpoint.version }
public var path: String {
switch self { // Switch must be exhaustive ERROR.
case .sets:
return "search/sets"
case .classes:
return "search/classes"
case .universal:
return "search/universal"
}
}
}
更新 #1
以下是关于我的协议Endpoint 的详细信息:
/// Represents an Endpoint for networking.
public protocol Endpoint: URLConvertible, URLRequestConvertible {
/// The url without any parameters or paths.
var baseURL: String { get }
/// The version of the API.
var version: Float { get }
/// The path to the resource.
var path: String { get }
/// Any parameters to be encoded.
var params: Parameters { get }
}
public extension Endpoint {
public func asURL() throws -> URL {
let finalURL = try baseURL.asURL().appendingPathComponent("\(version)").appendingPathComponent(path)
return finalURL
}
func asURLRequest() throws -> URLRequest {
let finalURL = try asURL()
let request = URLRequest(url: finalURL)
return try URLEncoding.default.encode(request, with: params)
}
}
更新 #2
好的,现在我几乎可以肯定这是一个 Xcode 错误。将default 子句添加到我的枚举会产生一个编译器警告,指出default 子句永远不会被执行,因此编译器有点同意default 子句是多余的:
public var path: String {
switch self {
case .sets:
return "search/sets"
case .classes:
return "search/classes"
case .universal:
return "search/universal"
default: return "" // WARNING: Default will never be executed.
}
}
我是疯了还是这是一个 Xcode 错误?我已经尝试清理构建文件夹,定期清理,多次重建,但我似乎无法让这个错误消失。我开始相信这是 Xcode 中的错误,因为我正在运行测试版,但我只想仔细检查并确保它不是我这边的错误。
【问题讨论】:
-
请张贴代码,而不是截图——最好是minimal reproducible example。
-
@MartinR 会更新我的问题
-
@LeoDabus 但我对所有情况都满意
-
您的代码为我编译(如果我删除未清除的原始类型“端点”)
-
这绝对是 Xcode 9 beta 2 的一个错误。在详尽性上正确检测到具有单个案例
case a(String?, String?, Bool?, Int?, Int?, Int?)的枚举上的开关,但不适用于case a(String?, String?, Bool?, Bool?, Int?, Int?)。它以某种方式取决于枚举案例的关联值的数量和类型。 Xcode 8.3.3 不会发生这种情况。