2016-11-30 34 views
5

私はプロジェクトをSwift 3にアップデートしていて、解決できないような警告が表示されました。Swift 3警告:オプションのチェックで使用される 'String'タイプの非オプション式

fileprivate var filteredTitlesList: [String] = [] 

if let filteredTitle: String = filteredTitlesList[indexPath.row] as String { // 'Non-optional expression of type 'String' used in a check for optionals' 

    // Do something 

} 

同様の質問への答えはここに私を助けていない:Non-optional expression of type 'AnyObject' used in a check for optionals

おかげでたくさん!

+0

ようfilteredTitlesList'は 'STRING'要素の配列で、'ので、あなたが作る必要はありませんこの配列内の要素をそれ自身の要素型に変換します。したがって、ここではオプションのバインディングは必要ありません。 'filteredTitlesList'が' Any'要素の配列であれば、オプションのバインディング句の中で変換を試みることができました( '? ')。 – dfri

+0

あなたは 'String'の配列を持っていて、それから' String'という項目を取得し、それを 'String'にキャストします。そしてそれが「無」であることを期待してください。私は正しいですか? – user28434

+0

あなたは文字列の配列を持っています - その宣言によると - 決してゼロになることはありません。したがって、 'if'条件全体は意味をなさない。 – Codo

答えて

7

アンラップされた値をアンラップしようとしています。アンラップする必要がないため、エラーが発生しています。以下のように見えるためにあなたのif文を変更して、あなたは黄金のようになります。

if filteredTitleList.count > indexPath.row { 
    let filteredTitle = filterdTitleList[indexPath.row] 
} 

は残念ながらif文の中に変数をバインドする方法はありません、うまくいけば、彼らは将来的に1を追加します。あなたが例えば文を入れしようとしているとき

+0

これは一般的に、明示的な索引付けによって配列にアクセスする前に、バインド・チェックのための賢明なアプローチですが、配列が表ビューのデータ・ソースである特定のOPの場合、このデータソースに問題があります。 'indexPath.row 'はfilteredTitleList'の無効な要素インデックスです(これは実際に他の場所にある問題の「修正」になります)。 – dfri

+0

@dfri合理的に言うと、 'filteredTitleList [indexPath.row]'は、データソースが完全に壊れていない限り、配列の範囲を決して超えてはいけません。私は安全なコーディングを奨励していますが、それにもかかわらず作るのは良い習慣です。 –

+0

指定されたインデックスパスに文字列が存在するかどうかを調べています。存在する場合は、filteredTitleに割り当てます。そうでない場合は、何もしないでください。私の無知を許してください。しかし、なぜこれがif letを使って安全でないのかわかりません。 – nontomatic

0

この警告の他の可能性がある:条件文でlet keyboardFrame: CGRect = keyboardFrameValue.cgRectValueifまたはguard

関連する問題