我创建了我的变量,如下所示
var unitTwo: Any
然后在我的脚本中运行一个函数,该函数返回Any类型的值。
此值可以是Int,String或Float 例如:0,0.0或“00:00:00”
unitTwo = returnTextFieldType(unitOneType: unitOneType, unitTwoType: unitTwoType).two
如果在添加到我的记录函数之前它是一个字符串,字符串将被转换为整数。 (秒数)
然后我需要检查一条记录,但在我的函数中它必须是一个Float
let newRecord = self.checkIfBetterRecord(unitTwo: Float(unitTwo), unitOne: Float(unitOne), unitTwoType: unitTwoType, unitOneType: unitOneType)
但是我得到了
无法使用类型的参数调用float类型的初始值设定项 (任何)
我还尝试使用unitTwo as! Float
进行预告,但我的应用也崩溃了,不要让我这样做。
我该如何解决这个问题?
由于
答案 0 :(得分:2)
正如我在Swift Any
中的评论中所提到的,始终是最差方式来声明常见类型。
这是 The Swift Way 中协议解决方案的一个简单示例。
协议UnitTypeConvertible
获得了一个计算属性unitTypeValue
,并为Int
,Float
和String
提供了扩展程序。
好处是类型UnitTypeConvertible
可以包含三种类型中的一种,并且通过调用Int
始终获得unitTypeValue
值。
protocol UnitTypeConvertible {
var unitTypeValue : Int { get }
}
extension Float : UnitTypeConvertible {
var unitTypeValue : Int { return Int(self) }
}
extension Int : UnitTypeConvertible {
var unitTypeValue : Int { return self }
}
extension String : UnitTypeConvertible {
var unitTypeValue : Int {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
guard let date = formatter.date(from:self) else { return 0 }
let startDate = formatter.date(from:"00:00:00")!
return Calendar.current.dateComponents([.second], from: startDate, to: date).second!
}
}
let time : UnitTypeConvertible = "01:23:45"
time.unitTypeValue // 5025
现在您可以声明
var unitTwo: UnitTypeConvertible
并写
let newRecord = self.checkIfBetterRecord(unitTwo: Float(unitTwo.unitTypeValue) ...