在Swift中添加类型Date和类型Int?

时间:2017-07-02 20:32:21

标签: swift

这是一个非常简单的问题,但它一直困扰着我。根据Swift的说法,不可能将不同类型的值加在一起(比如String和Int),即使它一起添加类型Date和类型Int,下面的代码如何工作呢?

IEnumerable<Control> allTxtBxs = GetAllControlsOfType(this, typeof(TextBox));
foreach (TextBox txtBx in allTxtBxs)
{
    txtBx.ForeColor = Color.HotPink;
}

2 个答案:

答案 0 :(得分:3)

Date的文档页面上,您可以看到 有一个+ 运算符将DateTimeInterval作为操作数:

  

返回添加了指定时间量的日期      static func +(lhs: Date, rhs: TimeInterval) -> Date

因此,您可以添加TimeIntervalDouble的类型别名) 到Date,但不是Int。您的代码编译是因为2828282 是一个&#34;数字字面&#34;并且编译器可以从中推断出类型 上下文为Double

这不会编译:

let delta = 2828282 // an Int
let someDate = Date() + delta
// error: binary operator '+' cannot be applied to operands of type 'Date' and 'Int'

您必须将Int转换为TimeInterval/Double

let delta = 2828282 // an Int
let someDate = Date() + TimeInterval(delta)

或使delta成为Double

let delta = 2828282.0 // a Double
let someDate = Date() + delta

答案 1 :(得分:1)

  

根据Swift的说法,不能将不同类型的值添加到一起(例如StringInt

与许多其他语言不同,数字类型之间没有自动转换,即数字促销,并且大多数预定义数字运算符都希望两个操作数具有相同的类型。

然而,Swift中没有任何内容可以阻止使用不同类型操作数声明运算符,并且您的示例Date() + 2828282是使用不同操作数类型定义预定义运算符的示例。

因此与Swift的区别在于缺少自动数字促销,而且realVar + intVar这样的组合没有预先定义。

在许多其他语言中,组合也未预先定义,但存在数字促销,因此示例编译为realVar + real(intVar)

HTH