具有隐式解包可选的 Swift 一元运算符

标签 swift option-type unary-operator binary-operators

所以我问了this question , 看起来是这个原因

var num:Int! = 0
num++

不起作用是因为 ++ 运算符采用 inout 参数,而隐式展开的可选参数则不是。然而,在

var num:Int! = 0
num = num + 1

+ 运算符与隐式解包可选一起使用,这意味着二元运算符不需要 需要inout 参数。所以我的问题是,为什么一元和二元运算符有不同的参数要求?对我来说,能够将 Int! 仅用于二元运算符,但将 Int 用于所有内容,这对我来说似乎有点愚蠢。

最佳答案

why do unary and binary operators have different parameter requirements?

好吧,这不是一元与二元的问题。有与 Int! 一起使用的一元运算符。例如:

var i: Int! = 17
var j = -i

- 是一元运算符,它可以工作。问题又回到了inout的问题上。 Int++ 前缀和后缀运算符不适用于 Int!,因为该变量作为 inout 传递> (因为 ++ 除了返回值之外还修改了原始变量)。 inout 要求类型完全匹配。

请注意,隐式展开的可选值仍然是可选值。

var i: Int! = 17
var k = i    // k has the type Int!
var m = i!   // m has the type Int

因此,将隐式展开的可选类型作为需要非可选类型的 inout 变量传递是行不通的,因为 inout 变量需要与预期的类型完全匹配并且 IntInt! 是两种截然不同的类型。该变量必须显式解包,或者您需要提供一个采用可选类型的重载函数。

你可能会问,为什么 Swift 不直接为你打开 Int! 并用 Int 调用 ++?好吧,++ 既修改了变量又返回了一个值。如果 Swift 解包 Int! 并用 Int 调用 ++,那么返回的类型将是 Int。然后 StackOverflow 上会有人问,“为什么 var i: Int!= 17; var j = i++ 使 j 成为 Int而不是 Int! ?”。要做到这一点,++ 需要在给定 Int 时返回一个 Int,并返回一个 Int! 当它被赋予一个 Int! 时。那么,重载函数需要什么。

可以重载 ++ 并为 Int! 创建 ++ 前缀和后缀函数:

prefix func ++(inout x: Int!) -> Int! {
    return ++x!
}

postfix func ++(inout x: Int!) -> Int! {
    return x!++
}

var i: Int! = 17
var j = ++i
print("i = \(i), j = \(j)")  // "i = 18, j = 18"
j = i++
print("i = \(i), j = \(j)")  // "i = 19, j = 18"

至于为什么 Swift 的设计者没有这样做,只有他们自己知道。

关于具有隐式解包可选的 Swift 一元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31764727/

相关文章:

C# 编译器行为问题?

swift - UserDefaults 检查 nil 值不起作用

ios - 结果不会从 JSON 附加

swift - 仅当一个表达式中的可选值不为 nil 时才调用函数?

ios - 为什么使 UIApplicationDelegate 中的 window 属性为可选而不是隐式解包可选?

javascript - 为什么这个一元函数在另一个 javascript 函数中?

swift - 当 UIView 完全加载时如何收到通知

ios - Segue 和使用 instantiateViewController 有什么区别?

generics - 确定类型时 match 和 unwrap_or 的区别

c++ - NOT char_pointer 是什么意思?