0

UIBezierPath に次の拡張機能を使用しています。

extension UIBezierPath {

    var elements: [PathElement] {

        var pathElements = [PathElement]()

        withUnsafeMutablePointer(&pathElements) { elementsPointer in

            CGPathApply(CGPath, elementsPointer) { (userInfo, nextElementPointer) in

                let nextElement = PathElement(element: nextElementPointer.memory)

                let elementsPointer = UnsafeMutablePointer<[PathElement]>(userInfo)

                elementsPointer.memory.append(nextElement)
            }
        }
        return pathElements
    }
}

これはサイトからです:

https://oleb.net/blog/2015/06/c-callbacks-in-swift/

ただし、これは次の行の Swift 3 で中断されます。

let elementsPointer = UnsafeMutablePointer<[PathElement]>(userInfo)

次のエラーが表示されます。

Cannot invade initializer for type 'UnsafeMutablePointer<[PathElement]>' with an argument list of type '(UnsafeMutableRawPointer?)'

これは Swift 3 の変更に関連していることを理解しています。UnsafeRawPointerMigration

https://swift.org/migration-guide/se-0107-migrate.html

ただし、これを Swift 3 に移植する最善の方法がよくわかりません。上記の拡張機能の更新されたコードを使用して、この点に関して何らかの助けを提供できますか?

4

1 に答える 1

0

この質問に関して、私は Ole Begemann に直接連絡を取りました。彼は非常に役に立ち、Swift 3 で動作する更新されたコードを迅速に提供してくれました。他の誰かが同じ問題に遭遇した場合は、同じものを共有してください。

これはうまくいくはずです:

extension UIBezierPath {

    var elements: [PathElement] {

        var pathElements = [PathElement]()

        withUnsafeMutablePointer(to: &pathElements) { elementsPointer in

            let rawElementsPointer = UnsafeMutableRawPointer(elementsPointer)

            cgPath.apply(info: rawElementsPointer) { userInfo, nextElementPointer in

                let nextElement = PathElement(element: nextElementPointer.pointee)

                let elementsPointer = userInfo?.assumingMemoryBound(to: [PathElement].self)

                elementsPointer?.pointee.append(nextElement)
            }
        }

        return pathElements
    }
}
于 2016-10-03T05:46:33.480 に答える