为什么我的 Swift 代码会尝试调用错误的 init 方法?

jbc*_*coe 1 swift

我有以下 Swift 课程:

public class Tree {

  var obj_ : OpaquePointer

  public init(fromCPtr obj:OpaquePointer) {
    obj_ = obj
  }

  convenience init(_ levels:Int32) {
    var rv : OpaquePointer?
    Tree_Tree_create(levels, &rv)
    self.init(fromCPtr:rv!)
  }

  deinit
  {
    Tree_Tree_dispose(obj_)
  }
}
Run Code Online (Sandbox Code Playgroud)

以及以下测试代码:

import Foundation                                                                                                                                                                
import Tree

let t = Tree(4)
print(t.data())
Run Code Online (Sandbox Code Playgroud)

我用以下命令编译 Tree 模块:

swiftc Tree.swift -import-objc-header Tree-Bridging-Header.h -L. -lTree_c -emit-module -emit-module-path build/Tree.swiftmodule -emit-library -module-name Tree -o build/Tree
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,不会出现错误或警告。

我用以下方法编译我的测试代码:

swiftc TestTree.swift -Ibuild/
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

TestTree.swift:4:14: error: cannot convert value of type 'Int' to expected argument type 'OpaquePointer'
let t = Tree(4)
Run Code Online (Sandbox Code Playgroud)

为什么 Swift 选择指针重载?据我了解,除非我调用 ,否则 Swift 不应该选择指针 init 方法init(fromCPtr some_pointer)Tree(Int32(4))在测试中使用没有什么区别。

如何让 Swift 选择正确的 init 方法?

Rob*_*ier 5

convenience init(_ levels:Int32) {
Run Code Online (Sandbox Code Playgroud)

这不是public初始化程序。添加public以使其在模块外部可见。默认访问级别为internal,仅在模块内部可见。