【发布时间】:2018-11-09 23:17:47
【问题描述】:
为什么这段代码会编译?
// ===============
// MyStruct.swift
// ===============
private enum MyError: Error {
case unexpectedError
}
public struct MyStruct {
static func throwError() throws {
throw MyError.unexpectedError
}
}
// ===============
// main.swift
// ===============
do {
try MyStruct.throwError()
}
catch {
print(error) // "unexpectedError"
}
documentation on access control 非常清楚,我们不能在公共类型成员中返回私有类型:
函数的访问级别不能高于其参数类型和返回类型
前面的语句对我来说似乎很明显,下面的示例显示了它如何无法编译(我们现在返回它而不是抛出它):
private enum MyError: Error {
case unexpectedError
}
public struct MyStruct {
// Note: we are now returning `MyError` instead of throwing
static func returnError() -> MyError { // Error: Method must be declared fileprivate because its result uses a private type
return MyError.unexpectedError
}
}
对我来说似乎并不明显且文档中未提及的是为什么我们可以在公共类型 (@987654325 @)。
【问题讨论】:
-
我会发表评论,因为我不太了解底层细节,但在投掷的情况下,
MyError不会公开暴露。您不能使用catch MyError.unexpectedError,因为它不是公开的。由于所有throws暴露都是Error,所以没有问题。但是对于return,您正在明确尝试公开MyError类型。
标签: swift private public access-control