简而言之,我正在尝试在浮点值之间进行数值运算,但似乎找不到任何解决方案。
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'类型的值
答案 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
也已弃用,并且
无需从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)
直接将字符串转换为浮点值数组。 第一个版本将无效数字替换为零,第二个版本 版本会跳过无效数字。