Для facebook - проблема заключается в новых правилах Swift о преобразовании параметров функции объектива-c в Swift.
Ранее, если параметры в Objective-C код не имеют атрибутов допустимость пустых (как nonnull
или nullable
), Swift преобразует его с !
делая их не по желанию (принудительное разворачивания). Теперь он конвертирует его с ?
, что делает их необязательными. Вот почему вы получаете ошибку. Перед тем, как клали в качестве обратного вызова для входа в систему:
(FBSDKLoginManagerLoginResult!, NSError!) -> Void
Теперь вам нужно поставить:
(FBSDKLoginManagerLoginResult?, Error?) -> Void
Кроме того, как вы видите, теперь вы не увидите NSError
класс. Вместо этого Swift поставит Error
. Это также новое правило. Теперь все «NS» с префиксом в именах классов удаляется в Swift (NSObject
->Object
; NSError
->Error
).
Пример рабочего кода для facebook входа в Swift 3.0:
let manager = FBSDKLoginManager()
manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) {
(loginResult: FBSDKLoginManagerLoginResult?, error: Error?) in
}
Пример рабочего кода для запроса facebook в Swift 3.0:
let request = FBSDKGraphRequest()
request.start {
(connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in
}
Как вы видите, теперь он использует Any
типа вместо объектива-c id
. В Swift 2.2 он использовал AnyObject
. Это также новое правило преобразования Swift.
Вам не нужно указывать тип параметров обратного вызова. Я сделал это в коде, чтобы выделить их реальные типы. Поэтому вы можете просто написать код без них:
let manager = FBSDKLoginManager()
manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult, error) in }
let request = FBSDKGraphRequest()
request.start { (connection, result, error) in }
Но вам нужно помнить, что они являются необязательными.
В заключении некоторых преобразующие правил, которые могут повлиять на вас обратный вызов код:
- параметры затворов являются необязательными, если в Objective-C не указаны допустимость пустых атрибутов
- Всех «NS» префиксы вынимаются цель -c классы Swift
- Если цель-с функцией имел
id
параметр, в Swift 3.0 он будет иметь тип Any
вместо AnyObject
Половина вашего ответа помогла мне ОЧЕНЬ много. Я надеялся, что вы поможете мне заполнить вторую половину. У меня есть метод делегата, который принимает NSError из объектива c, но когда я его конвертирую в swift, я не могу определить синтаксис, он жалуется, что мой класс не соответствует протоколу, из которого он пришел ... –
@LenaBru Поскольку NSError становится Ошибка в быстром 3, поэтому соответствующим образом измените свой метод. – Max
, чтобы получить член userInfo, я должен отдать его «как! NSError» ... это так ужасно ... –