2017-08-06 105 views
0

我创造了我的变量如下不能调用为float类型初始化与类型的参数(任意)

var unitTwo: Any 

然后在我的脚本我运行的返回类型的任何值的函数。

该值可以是int,String或浮动 例如:0,0.0或“00:00:00”

unitTwo = returnTextFieldType(unitOneType: unitOneType, unitTwoType: unitTwoType).two 

如果它是一个字符串添加到我的记录功能可以将字符串之前被转换为整数。 (秒数)

再后来,我需要检查的纪录,但在我的功能,它必须是一个浮动

let newRecord = self.checkIfBetterRecord(unitTwo: Float(unitTwo), unitOne: Float(unitOne), unitTwoType: unitTwoType, unitOneType: unitOneType) 

,但我得到

不能调用为float类型初始化与 类型(任何)

的说法我也试图与unitTwo as! Float但我的应用程序崩溃向下转型也和不要让我这样做。

我该如何解决这个问题?

感谢

+0

'这个值可以是int,String或浮动前:0,0.0或 “0”'为什么不用'NSNumber'这样的东西呢?该类是任何数值的包装,并提供一个int,float或string访问器。 – JAL

+0

我忘了提,我刚刚在我的帖子中编辑过,字符串也可以是“00:00:00” – Pierre

+2

这样的行不通。 ''00:00:00''你期望哪个浮点值?这不是有效的浮点格式。一个'Any'类型总是最糟糕的方式。使用更具体的类型或(创建)通用协议。 – vadian

回答

1

正如我在斯威夫特Any注释中始终是一个声明常见类型的最差方式。

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

协议UnitTypeConvertible得到一个计算的属性unitTypeValueIntFloatString提供扩展。

好处是,一个类型UnitTypeConvertible可以包含三种类型之一,你可以通过调用unitTypeValue总是得到Int值。

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) ... 
+0

这是一个很好的解释,谢谢。我会尽力理解这一点,并让它在我的脚本中工作,并会让你知道如果我有任何问题。我会在之后投票。 – Pierre

+0

它运作良好,我看到你已经改变了字符串扩展,是否更好?为什么使用DateFormatter()?其他方法可能发生的任何问题? @vadian – Pierre

+0

使用'DateFormatter'和'Calendar'比提取组件和手动*算术*聪明。 – vadian

相关问题