Все ваши valueX
переменные необязательны , потому что Float("0.0")
возвращает необязательное значение.Возможность сравнивать необязательные и необязательные значения напрямую была удалена в Swift 3, поскольку ее семантика неясна и может привести к неожиданным результатам (см. SE-0121 - Удалить необязательные операторы сравнения ).
То, что вы хотите, это
let value0 = Float(splitValues[0]) ?? 0.0
// ...
, так что значение является либо результатом преобразования splitValues[0]
в значение с плавающей запятой (если оно представляет действительное число), либо нулем.
Обратите внимание, что ваш код все равно будет аварийно завершать работу, если массив splitValues
содержит менее 4 элементов.Также characters
устарела, и преобразование из Substring
в String
не требуется:
let splitValues = message.split{$0 == " "}
if splitValues.count >= 4 {
let value0 = Float(splitValues[0]) ?? 0.0
// ...
}
Вы также можете использовать
let values = message.split{$0 == " "}.map { Float($0) ?? 0 }
или
let values = message.split{$0 == " "}.compactMap(Float.init)
для непосредственного преобразования строки в массив значений с плавающей запятой.Первая версия заменяет недопустимые номера на ноль, а вторая версия пропускает недопустимые номера.