在Swift中处理选项的习惯用法似乎过于冗长,如果您只想在值为零的情况下提供一个默认值:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
涉及不必要的代码复制,或者
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
这需要unwrappeValue
不是常量。
Scala的选项monad(与Swift的可选选项基本相同)的方法是getOrElse
:
val myValue = optionalValue.getOrElse(defaultValue)
我错过什么了吗?斯威夫特已经有了一个紧凑的方法来实现这一点吗?或者,如果做不到这一点,是否可以在可选的扩展中定义getOrElse
?
如果你写:
let result = optionalValue ?? 50
和optionalValue!=nil
然后结果
也将是可选的
,您将来需要打开它
但你可以写操作符
infix operator ??? { associativity left precedence 140 }
func ???<T>(optLeft:T?, right:T!) -> T!
{
if let left = optLeft
{
return left
}
else { return right}
}
现在你可以:
let result = optionalValue ??? 50
当optionalValue!=nil
时,结果
将被解压
截至2014年8月,斯威夫特拥有聚结运营商(?)这是允许的。例如,对于可选字符串myOptional,您可以编写:
result = myOptional ?? "n/a"
使现代化
苹果现在增加了一个聚合运营商:
var unwrappedValue = optionalValue ?? defaultValue
在这种情况下,三元运算符是你的朋友
var unwrappedValue = optionalValue ? optionalValue! : defaultValue
您还可以为可选枚举提供自己的扩展:
extension Optional {
func or(defaultValue: T) -> T {
switch(self) {
case .None:
return defaultValue
case .Some(let value):
return value
}
}
}
然后你可以做:
optionalValue.or(defaultValue)
然而,我建议坚持使用三元运算符,因为其他开发人员可以更快地理解这一点,而无需研究或
方法
注意:我启动了一个模块,在swift中添加了一些常见的助手,比如
或
on
可选的
。
问题内容: 在Swift中处理可选选项的习惯用法似乎过于冗长,如果您只想在nil为零的情况下提供默认值,则它是: 涉及不必要地复制代码,或 这不需要是常数。 Scala的Option monad(与Swift的Optional基本相同)具有用于此目的的方法: 我想念什么吗?Swift已经有一种紧凑的方式做到这一点吗?否则,是否可以在扩展名中为Optional 定义? 问题答案: 更新资料 苹果现在
当我将firstThing(第一件事)设置为default(默认值)时,如果没有默认值nil(默认值),这将起作用,我会得到一个错误,即调用函数时缺少参数。 通过键入Int 我认为它使它成为可选的,默认值为零,对吗?如果是这样,为什么没有=nil它就不能工作?
为我在原始问题中提出的错误代码示例道歉。我试图把我的问题简单化,但结果却相当令人困惑。 我稍微修改了一下代码: 我得到了第一个错误: 所以我把最后一行改为: 然后在Orelse上弹出一个新的错误: Optional>类型中的方法orElse(Capture#4-of?extends Map.Entry)不适用于参数(AbstractMap.SimpleEntry) 我最初的问题是,我不知道如何为这
问题内容: 是否可以为可选的通用参数提供默认值? 我正在尝试做这样的事情: 但我说错了 这只是我试图做的不可能的事吗? 问题答案: 用您完成的方式是不可能的。仅考虑上述代码,什么是类型?就像它说的那样,编译器无法弄清楚(我也不能,因为数据不存在,我也不能。) 特定问题的解决方案是重载而不是使用默认值: 但这引发了您在这里做什么的问题。您会认为应该如此。否则,您在做什么?如果不诉诸(您应该强烈避免)
问题内容: 我有一个很奇怪的要求,其中要求我默认在HTML的下拉菜单中没有选择任何选项。然而, 我不能用这个 因为,为此,我将必须进行验证以处理第一个选项。有人可以在没有将第一个选项作为select标签的一部分的情况下帮助我实现此目标吗? 问题答案: 也许这会有所帮助 将默认显示。但是,如果您选择一个选项,则将无法再次选择它。 您也可以通过添加一个空白来隐藏它 因此它将不再显示在列表中。 选项2
所以,我一直在读C++标准,找到了[defns.Undefined](3.27,在我正在读的C++17草案中,请注意,当我在这里引用C++17时,我在其他标准中发现了类似的措辞)--这是未定义行为的定义。我注意到这样的措辞(强调我的): 注意:当本国际标准省略任何行为的明确定义时,或者当程序使用错误的构造或错误的数据时,可能会出现未定义的行为 现在,想想看,这有点道理。这有点像是说,如果标准没有给