Значение необязательного типа 'Float?'должен быть развернут в значение типа 'Float' - PullRequest
0 голосов
/ 16 октября 2018

Короче говоря, я пытаюсь выполнить числовые операции между значениями с плавающей запятой, но не могу найти никакого решения.

var scale0: Float = 1.0
var scale1: Float = 1.0
var scale2: Float = 1.0
var scale3: Float = 1.0


let splitValues = message.characters.split{$0 == " "}.map(String.init)
    // These values are coming in realtime and constantly changing
    // Optional ?? incase we cannot convert string to float

    let value0 = Float(splitValues[0]) ?? Float("0.0")
    let value1 = Float(splitValues[1]) ?? Float("0.0")
    let value2 = Float(splitValues[2]) ?? Float("0.0")
    let value3 = Float(splitValues[3]) ?? Float("0.0")

Все, что я пытаюсь сделать, это просто

if (value0 > scale0) {
    scale0 = value0
}

Iлибо сталкиваюсь с: двоичный оператор '>' не может быть применен к операндам типа 'Float?'и 'Float'

или (когда я оборачиваю переменные вокруг Float (var) и т. д.

Значение необязательного типа 'Float?' должно быть развернуто до значения типа 'Float'

1 Ответ

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

Все ваши 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)

для непосредственного преобразования строки в массив значений с плавающей запятой.Первая версия заменяет недопустимые номера на ноль, а вторая версия пропускает недопустимые номера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...