为什么 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
  }
}

...通过将其隐藏为非私有类型的值。这只是子类型化。或者:unexpectedErrorMyError 类型,但它是 也是 Error。你不能公开 type MyError,但你可以用它的值做任何你想做的事,只要你不告诉任何人比 [=37 更具体的事情=].

同样,你可以很容易地抛出一些私有类型的东西

public struct MyStruct {
  static func throwError() throws {
    throw MyError.unexpectedError
  }
}

因为 throw 想要一个 Error,你给它一个 MyError,而 MyError : Errorthrows 注释本身没有说明 throwError 抛出 MyErrors;它只是说它通常会抛出 Errors。