Изменения функции карты в Xcode 10 - PullRequest
0 голосов
/ 01 октября 2018

У меня есть переменная, объявленная как var noOfPlayers: [PlayerDetail]! Теперь, допустим, у меня есть свойство, объявленное как var playerReadyStatus: Bool = true внутри PlayerDetail.Теперь для каждого элемента внутри noOfPlayers я хочу изменить это свойство на PlayerDetail.Я использую карту для достижения этой цели, например

 func resetPlayerStatus(){
        noOfPlayers = noOfPlayers.map{ $0.playerReadyStatus = false; return $0} 
    }

Раньше это нормально работало в Xcode 9, но когда я обновился до Xcode 10, он говорит Value of type '[PlayerDetail]' has no member 'playerReadyStatus' Что-то изменилось в функции карты в Xcode 10?Каким должен быть новый подход к этому с использованием карты?

1 Ответ

0 голосов
/ 01 октября 2018

Почему происходит эта ошибка

Начиная с Swift 4.2, ImplicitlyUnwrappedOptional удаляется из системы типов и заменяется атрибутом.Это означает, что тип [PlayerDetail]! становится [PlayerDetail]? (необязательный массив элементов PlayerDetail) с атрибутом, утверждающим, что он может быть неявно развернут при использовании.

Поскольку тип noOfPlayers равен [PlayerDetail]?, ваш код использует Необязательно map(_:).Он проверяет, является ли значение nil, и применяет преобразование к развернутому значению, если оно не равно нулю.Это означает, что если noOfPlayers не ноль, развернутое значение [PlayerDetail] передается в замыкание.Массив сведений об игроке не имеет свойства playerReadyStatus, поэтому вы видите ошибку Value of type '[PlayerDetail]' has no member 'playerReadyStatus'.

Как ее решить.

Вы, вероятно, не имеетенужно иметь дополнительный массив игроков.Возможно, вы можете просто изменить тип на [PlayerDetail], но вам может потребоваться присвоить ему начальное значение (например, пустой массив) в зависимости от того, как он инициализируется.

Если вам необходимо провести различиемежду массивом и пустым массивом, тогда вы должны обращаться с ним как с необязательным при работе с noPlayers (и, возможно, изменить ! на ? в объявлении), например:

noOfPlayers = noOfPlayers.map { unwrappedNoOfPlayers in
    unwrappedNoOfPlayers.map { playerElement in 
        playerElement.playerReadyStatus = false; return playerElement 
    } 
}
...