私はプロジェクトをSwift 3に移行し、オープンソースフレームワークでは4つまでのエラーになりました。オープンソースコードはhttps://github.com/blackmirror-media/BMInputBoxです。 Swift 2.2ではうまくいきました。これらのエラーを除き、かなりスムーズに移行しました。エラーはすべて同じと状態です:関数型でない値を呼び出すことはできません(varとして宣言されています)
.../Pod/Classes/BMInputBox.swift:430:26:
Cannot call value of non-function type '((AnyObject...) -> Void)!'
ここではに関連するコードです:
/// Closure executed when user submits the values.
open var onSubmit: ((_ value: AnyObject...) -> Void)!
/// As tuples are not supported in Objc, this is a method, which is called as well, but instead an array of values are returned
open var onSubmitObjc: ((_ value: [AnyObject]) -> Void)!
/// Closure executed when user cancels submission
open var onCancel: (() -> Void)!
/// Closure executed when the value changes in the field. The caller can modify the value and return it
open var onChange: ((_ value: String) -> String)?
func cancelButtonTapped() {
if self.onCancel != nil {
self.onCancel()
}
self.hide()
}
func submitButtonTapped() {
// Submitting the form if valid
if self.validateInput() {
if self.onSubmit != nil {
let valueToReturn: String? = self.textInput!.text
if let value2ToReturn = self.secureInput?.text {
*Error> self.onSubmit(valueToReturn, value2ToReturn)
}
else {
*Error> self.onSubmit(valueToReturn)
}
}
if self.onSubmitObjc != nil {
let valueToReturn: String? = self.textInput!.text
if let value2ToReturn = self.secureInput?.text {
*Error> self.onSubmitObjc([valueToReturn!, value2ToReturn])
}
else {
*Error> self.onSubmitObjc([valueToReturn!])
}
}
self.hide()
}
// Shaking the validation label if not valid
else {
self.animateLabel()
}
}
私はスウィフトに新たなんだ、これが実際に行うことになっているものを考え出すのトラブルを抱えています。それを知らずに、Swift 3がそれについて好きでないものを理解するのは難しいです。
この行は実際に何をしていますか?私の経験の浅い目に
open var onSubmit: ((_ value: AnyObject...) -> Void)!
、変数(というよりも機能)として宣言された関数にタプルを渡すためにしようとしていると、それが何をするか、または何も返さないように、それが見えます。私は明らかに何かが欠けている。誰もがなぜそれが変数として宣言されているのか、なぜその中に定義されたロジックがないのか説明できますか?誰かがSwift 3が不平を言っている理由を知っていれば、それはボーナスになるでしょう!
'onSubmit'は暗黙的にアンラップされたオプションとして* closure *を保持する変数です。しかし、エラーメッセージは誤解を招きます。実際の理由は、文字列が 'AnyObject'に自動的にブリッジされなくなるということです。 - これらのクロージャー定義で 'AnyObject'を' Any'で置き換えると、問題が解決する可能性があります。 –
恐ろしい!それがトリックでした。ありがとう。そのことを私は永遠に理解していたでしょう。 – Lastmboy