Swift:添加可选整数

Posted

技术标签:

【中文标题】Swift:添加可选整数【英文标题】:Swift: adding optionals Ints 【发布时间】:2014-06-27 13:04:45 【问题描述】:

我声明如下:

var x:Int?
var y:Int?

我想要第三个变量z,它包含xy 的总和。据推测,x & y 是可选的,z 也必须是可选的:

var z:Int? = x + y

但这会产生编译器错误“可选类型'Int?'的值没有打开;你是不是要使用“!”或'?'"

如果我打开 x & y:

var z:Int? = x! + y!

我收到一个运行时错误,因为 xy 为零,因此无法解包。

我可以达到预期的效果如下:

var z:Int?

if let x1 = x 
    if let y1 = y 
       z = x1+y1
    

但这对于将 2 个整数相加似乎有点冗长!有没有更好的方法来实现这一点?

【问题讨论】:

如果 y 或 x 为 nil,您要忽略吗?然后使用??操作员。让 z = (y ?? 0) + (x ?? 0) 【参考方案1】:

这是我的看法,我认为它更干净:

let none:Int? = nil
let some:Int? = 2

func + (left: Int?, right:Int?) -> Int? 
    return left != nil ? right != nil ? left! + right! : left : right


println(none + none)
println(none + some)
println(some + none)
println(some + some)
println(2 + 2)

结果:

nil
Optional(2)
Optional(2)
Optional(4)
4

【讨论】:

【参考方案2】:

我能想到的最好的是:

if x && y 
    z = x! + y!;

由于它们都是可选的......真的没有办法避免:

    检查他们不是nil 在添加之前打开它们。

【讨论】:

“我为什么要 Optional Ints?”:没有理由——这纯粹是理论上的。 @AshleyMills 这种方式可以工作,但因为 Swift 语言。应该比 Obj-C 更清晰,这个例子在维护过程中会很难理解。让你的代码简单! 似乎可选链接会是一个不错的解决方案,但它只适用于对象方法、属性等。【参考方案3】:

IMO 最佳解决方案:

z = x.map  x in y.map  $0 + x  

您知道Optional<T> 上的地图操作员吗?这是很不错的。

文档说:

如果 self == nil,则返回 nil。否则,返回 f(self!)。

【讨论】:

好一个。或flatMap. @AuRis 是的,你可以,flatMap 返回一个 Optional<T>,在这种情况下不需要,因为当有实际值时我们肯定会返回一些东西 这是思考问题的正确方法,干得好【参考方案4】:

这完全取决于您要实现的目标,但您可以使用可选的元组来实现:

var xy: (Int, Int)?
var z: Int

if let (x1, y1) = xy 
    z = x1 + y1 // Not executed

xy = (3, 4)
if let (x1, y1) = xy 
    z = x1 + y1 // 7

更新 正如@Jack Wu 指出的那样,这改变了语义。如果你愿意更详细一点,你可以这样做:

func optIntAdd(x: Int?, y: Int?) -> Int? 
    if let x1 = x 
        if let y1 = y 
            return x1 + y1
        
    
    return nil


operator infix +!  
@infix func +! (x: Int?, y: Int?) -> Int?
    return optIntAdd(x, y)


var x: Int?
var y: Int?
var z: Int?

z =  x +! y // nil
x = 1
z =  x +! y // nil
y = 2
z =  x +! y // 3

不确定“+!”对运算符来说是一个有用的名称选择,但它不会让我选择“+?”。

【讨论】:

这改变了事物的语义...xy不能是(3, nil) 正确。除了编写一个接受可选参数并返回一个可选参数的函数之外,我看不出如何做到这一点,这似乎有点复杂 - 正如我在答案中所说,“这完全取决于你想要实现的目标。” 嗯……运算符重载和添加 2 个整数的函数……这不是 Swift 最好的时刻之一。 啊……但它们是不是整数——它们是可选的整数! :)【参考方案5】:

z = (x ?? 0) + (y ?? 0)

* 在 Xcode 9 上工作 *

【讨论】:

感谢您的确认【参考方案6】:

使用可选链:

z = x? + y?

【讨论】:

是的,这就是我希望它的工作方式。或者只是z = x + y 和如果任何一个 RHS 为 nil,z 为 nil。 如前所述,这不起作用。我不在一个可以实际测试它的环境中,只是抛出了一些看起来应该可以工作的东西:)

以上是关于Swift:添加可选整数的主要内容,如果未能解决你的问题,请参考以下文章

关于swift中的可选类型

Swift 可选(Optionals)类型

基础部分

在swift中将逗号添加到字符串整数[关闭]

Swift:使用不同整数大小时出错

遍历可选的整数列表 ifPresent