2016-12-03 13 views
-3

私はこの質問が無数の時間を求めてきたことを知っていますが、私はまだこれに対する答えを見つけるのに苦労しています。これは私のコードの残りの部分は、私はあなたが[NSString: Player]としてあなたの辞書を定義したが、あなたの鍵がStringあるスウィフト3にswift3メンバーのサブスクリプトへのあいまいな参照

func generateDummyPlayers(numberOfPlayers: Int32) -> [NSString : Player] { 
    var _players = [NSString : Player]() 
    if(numberOfPlayers) > 0 { 
     for i in 1...numberOfPlayers { 
      let name: String = "\(Player.prefix) \(i)"; 
      let player: Player = Player(name: name); 
      _players[name] = player; //Ambiguous reference to member 'subscript' 
     } 
    } 
    return _players; 
} 
+0

あなた 'player'オブジェクトが、それは誤りのようなものの可能性であるかもしれないよりも、オプションの値が含まれている場合。オプションのビューを辞書に格納しようとすると、ほとんどの場合、この種のエラーがスローされます。 –

答えて

3

をアップグレードして以来、このエラーだらけであっても、私は私のコードを持っている最も簡単な例です。あなたがにObjCでインタラクティブに必要がない場合は

var _players = [NSString : Player]() 
let name: String = "\(Player.prefix) \(i)" 

_players[name] = player // Error 

String使用:

var _players = [String : Player]() 
+1

'NSString'が必要な場合、' _players [name as NSString] = player'が動作します。 – vacawama

+0

ありがとうございますsoooooooo –

0

nameがSでありますこれはNSStringではありません。

func generateDummyPlayers(numberOfPlayers: Int32) -> [String : Player] { 
    var players = [String : Player]() 
    if numberOfPlayers > 0 { 
     for i in 1...numberOfPlayers { 
      let name = "\(Player.prefix) \(i)" 
      let player = Player(name: name) 
      players[name] = player 
     } 
    } 
    return players 
} 

必要なときは、(推奨されません)NSStringのにnameを変更することができます:あなただけの文字列(推奨)を使用するようにメソッドのシグネチャを変更することができ

_players[name as NSString] = player 

ます。また、(より多くの抽象化を使用することができますが、 reduce is less performant due to the struct copy costので、私は)、それを思いとどまら:

func generateDummyPlayers(numberOfPlayers: Int32) -> [String : Player] { 
    guard numberOfPlayers > 0 else { 
     return [:] 
    } 
    return (1...numberOfPlayers) 
     .map({ "\(Player.prefix) \($0)" }) 
     .reduce([:]) { 
      var players = $0 
      players[$1] = Player(name: $1) 
      return players 
    } 
} 
関連する問題