为什么公共类型会抛出一个私有类型的错误?

时间:2018-05-31 02:43:30

标签: swift private public access-control

为什么这段代码会编译?

// ===============
// 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)。

1 个答案:

答案 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,你给它一个ErrorMyErrorMyError : Error注释本身没有说明throws投掷throwError s;它只是说它可能会抛出MyError一般。