2016-10-20 3 views
0

私はプロジェクトを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が不平を言っている理由を知っていれば、それはボーナスになるでしょう!

+1

'onSubmit'は暗黙的にアンラップされたオプションとして* closure *を保持する変数です。しかし、エラーメッセージは誤解を招きます。実際の理由は、文字列が 'AnyObject'に自動的にブリッジされなくなるということです。 - これらのクロージャー定義で 'AnyObject'を' Any'で置き換えると、問題が解決する可能性があります。 –

+0

恐ろしい!それがトリックでした。ありがとう。そのことを私は永遠に理解していたでしょう。 – Lastmboy

答えて

1

onSubmitは、暗黙的にアンラップされたオプションとしてクロージャを保持する変数です。しかし、エラーメッセージは誤解を招く恐れがあり、実際の理由は、文字列(数字など)が自動的にこれらの中でAnyすべてタイプが準拠するプロトコル)によってAnyObjectの交換スウィフト3でもうAnyObject

を橋渡ししていないということですクロージャの定義は問題を解決するはずです。

関連する問題