2016-12-03 66 views
-3

我知道这个问题一直在问无数次,但我仍然在努力寻找答案。这是我在我的代码最简单的例子,即使我的代码的其余部分也充斥着这种错误自从我升级到斯威夫特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

你定义你的字典为[NSString: Player],但你的关键是String

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

_players[name] = player // Error 

如果您不需要互动与ObjC,使用String

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

如果你确实需要'NSString',那么'_players [名称为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 
} 

需要的时候你可以改变name到一个NSString(不推荐):

_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 
    } 
} 
相关问题