为什么这段代码会编译?
// ===============
// 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
}
}
对我来说似乎并不明显,并且在文档中没有提到,为什么我们可以在公共类型的方法中抛出这个私有类型(MyError
)( MyStruct
)。
答案 0 :(得分:3)
您可以轻松返回私人类型的内容
private enum MyError : Error {
case unexpectedError
}
public struct MyStruct {
static func myError() -> Error {
return MyError.unexpectedError
}
}
...将其隐藏为非私有类型的值。这只是一种分类。或者:unexpectedError
的类型为MyError
,但也是 Error
。你无法公开类型 MyError
,但你可以用它的值做任何你想做的事情,只要你不告诉任何人比“这些{{1更具体”更具体的东西。 }}的”。
同样,您可以轻松地抛出某种私人类型
Error
因为public struct MyStruct {
static func throwError() throws {
throw MyError.unexpectedError
}
}
想要一个throw
,你给它一个Error
和MyError
。 MyError : Error
注释本身没有说明throws
投掷throwError
s;它只是说它可能会抛出MyError
一般。