无法使用类型为(Any)

时间:2017-08-06 15:18:26

标签: swift

我创建了我的变量,如下所示

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进行预告,但我的应用也崩溃了,不要让我这样做。

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:2)

正如我在Swift Any中的评论中所提到的,始终是最差方式来声明常见类型。

这是 The Swift Way 中协议解决方案的一个简单示例。

协议UnitTypeConvertible获得了一个计算属性unitTypeValue,并为IntFloatString提供了扩展程序。

好处是类型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) ...