Xcode 7.3でSwift 2.2バージョンを使用しています。現在、Xcode 8を更新し、Swift 3.に移行しています。ネットワーキングの成功ブロックのように。
エラーは次のようになります
Cannot convert value of type '() -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?'
Swift 3。
また、Facebookのログインにも同じようなエラーがあります。
エラーは次のようになります
Cannot convert value of type '(FBSDKLoginManagerLoginResult!, NSError!) -> Void' to expected argument type 'FBSDKLoginManagerRequestTokenHandler!'
そして
Cannot convert value of type '(_, _, NSError!) -> Void' to expected argument type 'FBSDKGraphRequestHandler!'
このすべてのエラーは、Swift 3.のハンドラーブロックに関連しています。エラーを理解していないため、解決できません。ご協力をお願いします。ありがとうございます。
Xcodeがエラーについて私に知らせたいことは、それ以前はエラーを知りませんでしたが、オブジェクトの型指定を削除し、機能しました。
なので
manager.post(methodname, parameters: param, progress: nil, success:{ (dataTask, responseObj) in
if let dict : NSDictionary = responseObj as? NSDictionary {
print("Response of \(methodname) : \(dict)")
if dict.object(forKey: "response") as? String == "success" {
CompletionHandler(true, dict)
} else {
CompletionHandler(false, dict)
}
}
})
ここで、質問エラーに関して、タイプが指定されているdataTask
およびresponseObj
にエラーが示されています。タイプを削除した後、正常に機能しました。
Facebookのログインと同じ
@IBAction func fbLoginClicked(_ sender: AnyObject) {
let app = UIApplication.shared.delegate as! AppDelegate
app.fbLoginManager = FBSDKLoginManager()
app.fbLoginManager.logOut()
app.fbLoginManager.loginBehavior = FBSDKLoginBehavior.native
app.fbLoginManager.logIn(withReadPermissions: ["email"], from: self, handler: { (result, error) -> Void in
if error != nil {
print(error?.localizedDescription)
} else {
if (result! as FBSDKLoginManagerLoginResult).isCancelled == true {
} else {
self.fetchFacebookUserDetail()
}
}
})
}
ここでも、result
とerror
の型指定を削除し、問題を解決しました。そして、アプリ全体でこれに従ったとそれは働いた。私はエラーなしでプロジェクトを実行することができ、またそれは機能しています。ありがとう。
Facebookの場合、問題は新しいSwift Objective-c関数パラメーターのSwiftへの変換に関するルールにあります。
以前は、objective-cコードのパラメーターにnullability属性(nonnull
やnullable
など)がなかった場合、Swiftは!
で変換します]それらはオプションではありません(強制的なアンラッピング)。それを?
で変換してオプションにします。そのため、エラーが発生します。ログインのコールバックとして配置する前:
(FBSDKLoginManagerLoginResult!, NSError!) -> Void
今、あなたは置く必要があります:
(FBSDKLoginManagerLoginResult?, Error?) -> Void
また、ご覧のとおり、NSError
クラスは表示されません。その代わりにSwiftはError
を配置します。これも新しいルールです。クラス名のすべての"NS"はSwift(NSObject
-> Object
; NSError
-> Error
)。
Swift 3.0でのFacebookログインの作業コードの例:
let manager = FBSDKLoginManager()
manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) {
(loginResult: FBSDKLoginManagerLoginResult?, error: Error?) in
}
Swift 3.0でのfacebookリクエストの作業コードの例:
let request = FBSDKGraphRequest()
request.start {
(connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in
}
ご覧のとおり、現在、objective-c Any
の代わりに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 }
ただし、これらはオプションであることに注意する必要があります。
結論として、コールバックコードに影響する可能性のあるいくつかの変換規則:
id
パラメーターがあった場合、Swift 3.0では、Any
ではなくAnyObject
型になります。