2016-09-17 3 views
2

При попытке построить образец проекта BonMot,Неоднозначное использование 'INIT' с CFStringTransform и Swift 3

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

Я получаю эту ошибку на CFStringTransform линии

Ambiguous use of 'init' 

Проект Xcode 8 использует Swift 3

+0

это все работает для вас сейчас? Если вы все еще видите проблемы с последней версией, сообщите об ошибке в [BonMot] (https://github.com/Raizlabs/BonMot/issues). Однако, судя по дате вашего сообщения, я предполагаю, что вы столкнулись с этим в BonSpecialGenerator.swift, который позже был обновлен до Swift 3 и вообще не существует с BonMot 4.0. –

ответ

3

В Swift 2 типы указателей соответствуют NilLiteralConvertible, что позволяет необязательному типу указателя представлять нулевую ошибку тер. Поэтому, когда вы сделали

UnsafeMutablePointer<CFRange>(nil) 

компилятор фактически используя init(_ other: COpaquePointer) Инициализатора из UnsafeMutablePointer как COpaquePointer является NilLiteralConvertible и, следовательно, может представлять собой нулевой указатель.

Однако в Swift 3 (SE-0055) типы указателей больше не соответствуют ExpressibleByNilLiteral. Вместо того, чтобы позволить необязательному типу указателя представлять нулевой указатель, теперь это делается просто с помощью опций, где nil означает нулевой указатель.

Таким образом, вы можете просто передать nil непосредственно в параметре CFStringTransformrange, как он ожидает UnsafeMutablePointer<CFRange>!:

CFStringTransform(theCFMutableString, nil, kCFStringTransformToUnicodeName, false) 
Смежные вопросы