作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有 C++ 背景,但我正在学习 Swift 4 for MetalKit。因为我只习惯于 C++,所以对“可选”的整个关注对我来说有点陌生。在阅读 Apple 出版的 Swift 4 书籍时,我遇到了以下问题:
假设我有两个“字符串”a 和 b:
let a = "12"
let b = "24"
我想把这两个加在一起。写
是不好的做法并且是非法的let c = Int(a) + Int(b)
因为 a 和 b 都是字符串,所以将它们类型转换为 Int 是可选的:转换可能已经失败。解决方案似乎是
if let c = Int(a), let d = Int(b)
{
let e = c + d
}
但这有点麻烦:与在 C 程序中相比,我复制的方式更多,在 C 程序中我可以简单地添加 a 和 b,然后测试结果是否有值。是否有更有效、更好的方法来执行此添加?
最佳答案
正如@rmaddy 在他的评论中所说,这就是可选值的全部意义所在。它应该让您努力工作,从而产生更安全的代码。
如果您愿意做一些前期工作,您可以创建一个自定义运算符,如果转换为 Int
的结果为 nil<,该运算符将抛出错误
:
enum Err: Error {
case nilValue
}
func +(lhs: String, rhs: String)throws -> Int {
guard let c = Int(lhs), let d = Int(rhs) else {
throw Err.nilValue
}
return c + d
}
(您可能需要将 中缀运算符 +
添加到此代码段。)
然后你可以像这样使用它:
do {
let i: Int = try a + b
print(i)
} catch {
// Catch error here
}
或者使用try?
。如果抛出错误,这将返回 nil
:
let i: Int? = try? a + b
如果你不想使用类型注释,你可以给运算符一个不同的名字,即:
infix operator +?: AdditionPrecedence
func +?(lhs: String, rhs: String)throws -> Int
关于swift - 如何添加两个可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47932790/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!