101 字
1 分钟
Swift 调用 GLib
g_signal_connect
Swift无法调用C宏, 需要使用g_signal_connect_data
函数
let slot: @convention(c) (UnsafeMutableRawPointer?) -> Void = { data in
...
}
g_signal_connect_data(ptr, "signal", unsafeBitCast(slot, to: GCallback?.self), data, nil, G_CONNECT_AFTER)
slot必须标记为@convention(c)
, 否则unsafeBitCast
将产生fatalError
g_object_get_property
func gproperty<T, R>(of ptr: UnsafeMutablePointer<T>, name: String, transform: (UnsafeMutablePointer<GValue>) -> R) -> R {
ptr.withMemoryRebound(to: GObject.self, capacity: 1) {
var value = GValue()
g_object_get_property($0, name, &value)
return transform(&value)
}
}
再使用g_value_get族函数从GValue中获取值
let property = gproperty(of: ptr, name: "property") { g_value_get_variant($0) }