为什么 public 类型可以抛出一个私有类型的错误?
Why can a public type throw an error that is a private type?
为什么这段代码可以编译?
// ===============
// 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 很清楚我们不能 return public 类型成员中的私有类型:
A function can’t have a higher access level than its parameter types and return type
前面的陈述对我来说似乎很明显,下面的示例显示了它如何无法编译(我们现在 returning 它而不是抛出它):
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
}
}
对我来说似乎不太明显且文档中未提及的是,为什么我们可以 throw 这个私有类型 (MyError
) 在一个方法中public 类型 (MyStruct
).
你可以很容易地return一些私有类型的东西
private enum MyError : Error {
case unexpectedError
}
public struct MyStruct {
static func myError() -> Error {
return MyError.unexpectedError
}
}
...通过将其隐藏为非私有类型的值。这只是子类型化。或者:unexpectedError
是 MyError
类型,但它是 也是 和 Error
。你不能公开 type MyError
,但你可以用它的值做任何你想做的事,只要你不告诉任何人比 [=37 更具体的事情=].
同样,你可以很容易地抛出一些私有类型的东西
public struct MyStruct {
static func throwError() throws {
throw MyError.unexpectedError
}
}
因为 throw
想要一个 Error
,你给它一个 MyError
,而 MyError : Error
。 throws
注释本身没有说明 throwError
抛出 MyError
s;它只是说它通常会抛出 Error
s。
为什么这段代码可以编译?
// ===============
// 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 很清楚我们不能 return public 类型成员中的私有类型:
A function can’t have a higher access level than its parameter types and return type
前面的陈述对我来说似乎很明显,下面的示例显示了它如何无法编译(我们现在 returning 它而不是抛出它):
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
}
}
对我来说似乎不太明显且文档中未提及的是,为什么我们可以 throw 这个私有类型 (MyError
) 在一个方法中public 类型 (MyStruct
).
你可以很容易地return一些私有类型的东西
private enum MyError : Error {
case unexpectedError
}
public struct MyStruct {
static func myError() -> Error {
return MyError.unexpectedError
}
}
...通过将其隐藏为非私有类型的值。这只是子类型化。或者:unexpectedError
是 MyError
类型,但它是 也是 和 Error
。你不能公开 type MyError
,但你可以用它的值做任何你想做的事,只要你不告诉任何人比 [=37 更具体的事情=].
同样,你可以很容易地抛出一些私有类型的东西
public struct MyStruct {
static func throwError() throws {
throw MyError.unexpectedError
}
}
因为 throw
想要一个 Error
,你给它一个 MyError
,而 MyError : Error
。 throws
注释本身没有说明 throwError
抛出 MyError
s;它只是说它通常会抛出 Error
s。