2017-07-14 2 views
1

私はswiftクラスから目的関数cのメソッドを呼び出しています。私の目的は、NSNumberの形式で数値を取得することです。私は迅速に数字のタイプを定義しなかったが、まだ私は以下のメッセージを得る。これを解決する方法はありますか?Float型の値を予想される引数型NSNumberに変換できません

enter image description here

- (void)getPercentageMatch:(NSString *)answer listOfAnswers:(NSArray *)validAnswers completionBlock:(void(^)(BOOL isSuccess, NSNumber *percent))completionBlock { 
NSMutableDictionary *params = [NSMutableDictionary dictionary]; 
[params setValue:answer forKey:@"myanswer"]; 
[params setValue:validAnswers forKey:@"answers"]; 
NSMutableURLRequest *req = [AuthorizationHandler createAuthReq:@"POST" path:@"validateAnswer" params:params]; 

AFJSONRequestOperation *op = [[AFJSONRequestOperation alloc] initWithRequest:req]; 
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSDictionary *responseheaders = (NSDictionary *)responseObject; 
    if (completionBlock) { 
     completionBlock(true, [responseheaders valueForKey:@"percentage"]); 
    } 
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    if (completionBlock) { 
     completionBlock(false, 0); 
    } 
}]; 
[op start]; 
return; 
} 

私も強制終了ブロック型キャスト

as! completionBlock(Bool, NSNumber) 

が、このdoesntの仕事。

私は迅速に新しいですし、任意のチュートリアル/ポインタが理解されるであろう:)

EDIT 1:私は完了ブロック

let completionBlock = { (isSuccess, percent) in 
     print("-------", isSuccess, percent) 
    } 
    MTRestkitManager.instance().getPercentageMatch(_:text, listOfAnswers:validAnswers, completionBlock:completionBlock) 

を変更すると

私はすべてのエラーを得ることはありませんが。しかし、少し修正を加えるとエラーになります。

enter image description here

なぜ行動が変化していますか?

EDIT 2:型の値を変換できません ' - >(ボイド)(BOOL、のNSNumber)': kelinのソリューション以下は、次のように私はエラーが発生します最後の行に

@IBAction func submitButtonTapped(_ sender: Any) { 
    answerTextView.resignFirstResponder() 
    if answerTextView.textColor == UIColor.lightGray { 
     ZUtility.showError(NSLocalizedString("Please enter answer before submitting", comment: "")) 
     return; 
    } 
    if answerTextView.text.isEmpty { 
     ZUtility.showError(NSLocalizedString("Please enter answer before submitting", comment: "")) 
     setPlaceholderText() 
     return; 
    } 
    let text = answerTextView.text as String 
    let completionBlock = { (isSuccess, percent:NSNumber) -> (Void) in 
     self.handleAnswer(isSuccess: isSuccess, percent: Float(percent)) 
    } 
    MTRestkitManager.instance().getPercentageMatch(_:text, listOfAnswers:validAnswers, completionBlock:completionBlock) 
} 

を変更作ら'?!((BOOL、のNSNumber) - >(ボイド)' 予想引数の型に明らかに

+1

あなたのスワイプコードは画像ではありません。 – Bilal

+0

どうやって違いがありますか? –

+0

これを参照してください... https://meta.stackoverflow.com/a/285557/1825618 – Bilal

答えて

0

FloatselfhandleAnsewer()機能から推測されますが、手動でcompletionBlockに適切な型を定義する必要があります。

let completionBlock = { (isSuccess, percent: NSNumber?) in 
    self.handleAnsewer(isSuccess: isSuccess, percent: percent.floatValue ?? 0) 
} 

そして、自動的にSwiftに型キャストすることはできませんので、NSNumber(value: myFloat)Int(percentなどの明示的な初期化子を呼び出すことを忘れないでください。

P.S.私はあなたがPythonから来たと確信しています:)

+0

答え、kelinありがとう。私は自分のコードを変更してコンパイルしましたが、実行時に次の行のメッセージEXC_BAD_INSTRUCTIONで失敗します: MTRestkitManager.instance()。getPercentageMatch(_:text、listOfAnswers:validAnswers、completionBlock:completionBlock as!(Bool、NSNumber?) - > Void ) –

+0

'Float(percent)'のようなものはオプションの値を返します。私は答えを更新しました。 – kelin

+0

ありがとうございます。私はまだEDIT 2で与えられた問題に直面しています。なぜ期待される引数型NSNumberがオプションなのか?私は客観的には、このような概念はないと信じています。 –

関連する問題