2016-12-03 5 views
-3

Я знаю, что этот вопрос задавал бесчисленное количество раз, но я все еще пытаюсь найти ответ на этот вопрос. Это самый простой пример, который я имею в моем коде, даже если остальная часть моего кода также пронизан этой ошибке с тех пор я повышен до Swift 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 [name as NSString] = player' будет работать. – vacawama

+0

Спасибо вам, как soooooooo –

0

name является S tring, так что это не NSString. Вы можете изменить метод подписи использовать только String (рекомендуется):

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 
    } 
} 
Смежные вопросы