我有以下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方法?
答案 0 :(得分:4)
convenience init(_ levels:Int32) {
这不是public
初始值设定项。添加public
以使其在模块外部可见。默认访问级别为internal
,仅在模块内可见。