用CFStringTransform和Swift 3模糊地使用'init'

在尝试构buildBonMot的示例项目时,

let theCFMutableString = NSMutableString(string: myString) as CFMutableString CFStringTransform(theCFMutableString, UnsafeMutablePointer<CFRange>(nil), kCFStringTransformToUnicodeName, false) 

我在CFStringTransform行上得到这个错误

 Ambiguous use of 'init' 

Xcode 8项目使用Swift 3

在Swift 2中,指针types符合NilLiteralConvertible ,允许一个非可选的指针types来表示一个空指针。 所以当你这样做的时候

 UnsafeMutablePointer<CFRange>(nil) 

编译器实际上是使用init(_ other: COpaquePointer)init(_ other: COpaquePointer)初始化UnsafeMutablePointer ,因为COpaquePointerNilLiteralConvertible ,因此可以表示一个空指针。

但是在Swift 3( SE-0055 )中,指针types不再符合ExpressibleByNilLiteral 。 而不是允许一个非可选的指针types来表示一个空指针,这现在简单地用optionals来完成,其中nil意味着一个空指针。

因此,您可以直接将nil传递给CFStringTransformrange参数,因为它需要一个UnsafeMutablePointer<CFRange>!

 CFStringTransform(theCFMutableString, nil, kCFStringTransformToUnicodeName, false)