2017-07-14 33 views
0

古いプロジェクトをインポートしたので、それをSwift 3に変換するよう促しました。Swiftで高度に知識のない人は、エラーを修正するのが難しいです。 Error can be found at this imageタイプ 'Any'には添え字メンバーがありません - NSMutableArray

import Foundation 

class CellDescriptorHelper { 

let itemKey = "Items" 
let isExpandableKey = "isExpandable" 
let isExpandedKey = "isExpanded" 
let isVisibleKey = "isVisible" 
let titleKey = "title" 
let locationKey = "location" 
let descriptionKey = "description" 
let imageURLKey = "imageURL" 
let typeKey = "type" 
let cellIdentifierKey = "cellIdentifier" 
let additionalRowsKey = "additionalRows" 

fileprivate var cellDescriptors: NSMutableArray! 
fileprivate var cellsToDisplay: NSMutableArray! 

func getCellDescriptors(_ type: String) -> NSMutableArray { 

    loadCellDescriptors(type) 
    return cellDescriptors; 
} 

func loadCellDescriptors(_ type: String) { 

    cellDescriptors = PlistManager.sharedInstance.getValueForKey(itemKey)! as! NSMutableArray 

    for i in 0..<(cellDescriptors[0] as AnyObject).count-1 { 

     let cellType = cellDescriptors[0][i][typeKey] as! String //creates error 
     if(cellType != type) { 
      cellDescriptors[0][i].setValue(false, forKey: isVisibleKey) //creates error 
     } 
    } 
} 
} 
+0

あなたのコードを画像ではなくテキストのように質問に入れてください。 – user28434

+1

@ user28434こんにちは、私は投稿を編集しました。 – nkpg

+0

@Honey - Swiftコードに関する質問にObjective-Cタグを追加したのはなぜですか? – rmaddy

答えて

6

このエラーが表示される理由は、配列にあるオブジェクトの型がコンパイラにとってあいまいであるためです。

NSArrayが具体的にタイプされていないことが原因です。 NSArrayは基本的にArray<Any>または[Any]のObjective-Cブリッジです。

let cellType = cellDescriptors[0][i][typeKey] as! String

コンパイラは、それが上記のものとして宣言されているようcellDescriptorsNSArrayであることを知っている...私はあなたのコードを順を追ってみましょう。 NSArrayは、cellDescriptors[0]のように、指定されたインデックスの値を取得するためにサブスクリプトすることができます。これが与える値は上記のようにタイプAnyなので、cellDescriptors[0][i]でもう一度試してみるとエラーになります。偶然にも、あなたはおそらく、配列にAnyオブジェクトは、その後、あなたがそうのように、添字を実行できるようになりますことをキャストすることができます:

if let newArr = (cellDescriptors[0] as? [Any])[i] { }しかし、これは本当に素敵なアプローチ、あなたではありません厄介な選択肢の負荷に対処することになります。

具体的には、cellDescriptorsの具体的な宣言があります。私はあなたの型構造がどのように存在するのか分かりませんが、物事の見た目では、それは辞書の配列の配列です(yuck)。したがって、未加工の書式では、あなたの宣言は今のように添え字を付けるためにvar cellDescriptors = [[[AnyHashable:Any]]]()でなければなりません。

これは、あなたが持っているコードが面倒だと言っています。あなたのオブジェクトをより使いやすくするためのモデリング方法を変更することを検討します。

+2

この行 'var cellDescriptors = [[:]]]'はエラーです: '非関数型の値を呼び出せません '[Array Honey

+1

'' var cellDescriptors = [[[String:String]]]() 'を試してください。明示的な型はうまくいくはずです。 –

+1

はい、私の悪い、私は割り当てと宣言の構文が混ざっていました。 –

1

NSMutableArrayのは本当に...ずっと伝えアンラップ力を避け、そのタイプが配列の最初のすべきだと思いますしようとしません。最初は、配列はサブスクリプトにしたがって配列の内側にあるはずです...だからNSMutableArrayの代わりにOverTypeをタイプしてみてください:[[Any]]しかし、このオプションは本当に安全ではありません!

ITEMKEY値がどうあるべきかについての詳細な情報を提供...しかしoverally私の最高の先端がこれですしてください:

func loadCellDescriptors(_ type: String) { 

    guard let cellDescriptors = PlistManager.sharedInstance.getValueForKey(itemKey)? as? [[String: Any]], let firstDescriptor = cellDescriptors[0] 
else { return } 


for someKeyInDict in 0..<cellDescriptor.count{ 

     if let cellType = cellDescriptor[i][typeKey] as? String{ 
     if(cellType != type) { 
      cellDescriptors[0][i].setValue(false, forKey: isVisibleKey) 
     } 
     } 
    } 

これは100%の仕事をしませんが、近くにあなたを得るでしょう、ちょうど私ヒントは、あなたがserachingしている値は辞書です...

+0

説明しようとしていることを具体的に説明するコードを教えてください。 – nkpg

+0

ここにコードを最初にコピーした場合のみ –

+0

ありがとうございました –

3

これらの行は二つの問題があります。

fileprivate var cellDescriptors: NSMutableArray! 
fileprivate var cellsToDisplay: NSMutableArray! 

まず、彼らは!タイプ(オプションまたはIUOs暗黙的に開封された)です。彼らは決して!タイプであったはずはありませんが、Swift 3ではSwift 2とは異なる動作をします。 !を取り除き、空の配列に割り当てて開始します。!タイプはまだ便利です非常に少数の場所があります(@IBOutlet!タイプは、少なくとも意見の問題として、適切なものとすることができる最後のホールドアウトの一つですが。)

他の問題はNSMutableArrayがずさんなタイプがあるということですそれは、スウィフトで頭痛のトンを作成します。非常にまれなケースでObjective-Cへのブリッジが必要とする場合にのみ使用してください(これはNSMutableArrayでは非常にまれです)。

NSMutableArrayではなくとcellsToDisplayを適切なArrayに変換してください。 「適切」とは、「実際に何が入っているかの配列」を意味します。つまり、[Any]は適切なタイプではありません。 cellsToDisplayCell個のオブジェクトが含まれている場合は、[Cell]である必要があります。

関連する問題