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

时间:2018-04-23 09:57:57

标签: 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_)
  }
}

以下测试代码:

import Foundation                                                                                                                                                                
import Tree

let t = Tree(4)
print(t.data())

我用以下代码编译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

这没有错误或警告。

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

swiftc TestTree.swift -Ibuild/

并收到以下错误:

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

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

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

1 个答案:

答案 0 :(得分:4)

convenience init(_ levels:Int32) {

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