可选类型“浮点型”的值必须解包为'Float'类型的值

时间:2018-10-16 05:10:36

标签: swift

简而言之,我正在尝试在浮点值之间进行数值运算,但似乎找不到任何解决方案。

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
}

我要么面临: 二进制运算符'>'不能应用于类型为'Float?'的操作数和“浮动”

或(当我将变量包装在Float(var)等周围

可选类型“浮点型”的值必须解包为'Float'类型的值

1 个答案:

答案 0 :(得分:3)

您所有的valueX变量都是可选的,因为Float("0.0")返回 可选的。比较可选值和非可选值的可能性 在Swift 3中直接删除了它,因为其语义尚不清楚,并且可能导致令人惊讶的结果(请参见SE-0121 – Remove Optional Comparison Operators)。

您想要的是

let value0 = Float(splitValues[0]) ?? 0.0
// ...

因此该值要么是splitValues[0]到浮点值(如果代表有效数字)转换的结果,要么是零。

请注意,如果splitValues数组,您的代码仍然会崩溃 包含少于4个元素。 characters也已弃用,并且 无需从SubstringString的转换:

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)

直接将字符串转换为浮点值数组。 第一个版本将无效数字替换为零,第二个版本 版本会跳过无效数字。