2016-09-19 10 views
2

経由で値を設定することができません:今、私は迅速にそれを変換しようとしているので、私はこれやった私はこれ持っていた私のObjective Cのコードでは、プロトコル

if ([view conformsToProtocol:@protocol(UITextInputTraits)]) { 
    id<UITextInputTraits> field = view; 
    field.enablesReturnKeyAutomatically = YES; 
} 

を:

if var field = view as? UITextInputTraits { 
    field.enabledReturnKeyAutomatically = true 
} 

「フィールド」が不変であると言うコンパイルエラーが発生します。これを達成する正しい方法は何ですか?

答えて

0

この問題は、オプションのプロトコル要件を処理するSwiftの特有の方法によって発生します。オプションのプロトコルプロパティにはセッターがありません。 (私はこれを言語のバグと見なします)。あなたはそれを回避する必要があります。

あなたは(恐ろしい)と言うことができます:

switch view { 
case let field as UITextField: 
    field.enablesReturnKeyAutomatically = true 
case let field as UITextView: 
    field.enablesReturnKeyAutomatically = true 
default: break 
} 

別の方法(均等に恐ろしい):

let setter = #selector(setter:UITextInputTraits.enablesReturnKeyAutomatically) 
if view.responds(to:setter) { 
    view.perform(setter, with: 1 as NSNumber) 
} 
+0

しかし、問題は修正されません。ビューはUITextFieldであったり、UITextViewであったりします。だからこそ私は具体的なクラスの代わりに両方が実装するプロトコルを使用しようとしています。 – Gargoyle

+0

私は知っています。それは吸う。私は両方のケースをカバーするために私の答えを改訂しましたが、それはまだ吸う。バグレポートを提出してください! – matt

+0

私はもう一つの恐ろしい解決策を追加しました。何が混乱している。 – matt

関連する問題