当前位置: 首页 > 知识库问答 >
问题:

Swift一元运算符,隐式展开可选

贺季同
2023-03-14

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

var num:Int! = 0
num++

之所以不起作用,是因为操作符采用了inout参数,而隐式取消包装的选项不是。然而,在

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

操作符与隐式unwrapped选项一起工作,这意味着二进制操作符不需要inout参数。所以我的问题是,为什么一元运算符和二元运算符有不同的参数要求?对我来说,能够使用Int似乎有点傻

共有1个答案

慕胡媚
2023-03-14

为什么一元运算符和二元运算符有不同的参数要求?

这不是一元对二元的问题。有一元运算符可用于Int 。例如:

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

-是一元运算符,它可以工作。问题又回到了inout的问题上。Int的前缀和后缀运算符不适用于Int 输入输出要求类型完全匹配。

请注意,隐式展开选项仍然是选项。

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

因此,将隐式展开的可选变量作为需要非可选类型的inout变量传递是行不通的,因为inout变量需要与预期的类型和Int以及Int完全匹配 是两种截然不同的类型。变量必须显式展开,或者需要提供采用可选类型的重载函数。

你可能会问,为什么斯威夫特不直接打开Int 都会修改变量并返回一个值。如果Swift打开了内码并用Int调用,则返回类型为Int。然后你会有人在StackOverflow上问:“为什么VarI:Int!=17;VarJ=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"

至于为什么斯威夫特的设计师没有这样做,只有他们知道为什么。

 类似资料:
  • 问题内容: 为什么无法对隐式解包的可选变量进行突变? 这是一个重现问题的简短示例: 带整数 问题答案: 更新: Xcode Beta 5中的一个小警告已解决此问题: 该数组可以按预期工作,但是现在看来整数仍然需要显式拆包以允许使用 当前,这仅仅是Optionals的本质(无论是否隐式解包)。unwrap运算符返回一个不变的值。这可能是固定的,或者将来会提供更好的解决方案。 目前唯一的解决方法是将数

  • 考虑这段代码: 这在Clang或GCC下不起作用,给我: 错误:不同指针类型“Foo*”和“Bar*”之间的条件表达式缺少强制转换Base*obj=!酒吧foo:bar; 这意味着要编译它,我必须将代码更改为: 既然存在到< code>Base*的隐式转换,那么是什么阻止了编译器这样做呢? 换句话说,为什么不使用强制转换,但使用操作员没有?是因为我不清楚我想使用部件吗?

  • 在编写一个新的swift类时,当(不)使用隐式展开选项而不仅仅是普通选项时,我仍然不是100%舒服。据我所知,如果你从来没有期望它的值为零,那么把它指定为隐式未包装(可选)应该是可以的。如果为nil,则为异常事件,应导致运行时错误。 例如,这个简单的登录视图包含两个text field成员变量: 在上面的类中,emailField和passField都被归类为隐式展开选项,因为我从来没有期望它们在

  • 请原谅我的无知,我恐怕错过了一些基本的选项理解。我的印象是(隐式展开的可选指示符)保证该类型的变量不为零。然而,这个非常简单的Apple API很少会返回我。 这是一个意外的错误还是Optionals规范的一部分?因为如果这是规范的一部分,我不明白为什么会有选项,而不是变量可以存在或。

  • 问题内容: 我有以下代码 从2.2开始,我收到了折旧警告,有什么想法可以解决此问题? 我有这个解决方案: 但这不是很好。 问题答案: 怎么样: 看来您可能正在执行类似时钟算术的操作。如果是这样,那么可以更好地理解这一点:

  • 主要内容:1. 算术运算符,2.比较运算符,3.逻辑运算符,4.按位运算符,4.分配运算符,5.范围运算符,6.其它运算符,7.运算符优先级运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。 Swift内置运算符丰富,它提供以下类型的运算符 - 算术运算符 比较运算符 逻辑运算符 按位运算符 分配运算符 范围运算符 杂项运算符 本教程将逐一解释算术,关系,逻辑,按位,赋值和其他运算符。 1. 算术运算符 下表显示了Swift 4语言支持的所有算术运算符。 假设变量,变量,则 - 运算符 描述