CTRunDelegateRef
を扱う上でインスタンスをUnsafeMutablePointer
にする必要がある部分がでてきたので、下記の方法だとアプリもクラッシュせずエラーも出ずに動いたので書き残します。
let originalView = UIView()
print(originalView) //"UIView: 0x7fcd29f031a0"
//UnsafeMutablePointerに変換
let pointer = UnsafeMutablePointer<UIView>(Unmanaged.passRetained(originalView).toOpaque())
//UIView取得
let takeValue = Unmanaged<UIView>.fromOpaque(COpaquePointer(pointer)).takeRetainedValue()
print(takeValue) //"UIView: 0x7fcd29f031a0"
Sample
extension UIView {
class func view(pointer pointer: UnsafeMutablePointer<Void>) -> UIView {
return Unmanaged<UIView>.fromOpaque(COpaquePointer(pointer)).takeRetainedValue()
}
}
class HogeView: UIView {
func createWidthCallback() -> CTRunDelegateGetWidthCallback {
return {
let view = UIView.view(pointer: $0)
return view.bounds.size.width
}
}
}
CTRunDelegateGetWidthCallback
などのtypealias
で@convention(c)
が付加されているものでも、static
なメソッドでpointer
から自身を取得するようにすればエラーは起こらなくなります。
逆にself
にアクセスするとエラーが起こります。