gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:44:36 26 4
gpt4 key购买 nike

所以我问了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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com