swift 可空类型的switch使用
当前版本xcode 7.2.1 swift应该是2.0
首先来看一下
var intNum = 5
var intNumRange = 2...5 //Range<Int>
switch intNum {
case 1:
print("is 1")
case intNumRange :
print("in [2 5]")
default:
print("out range")
}
// in [2 5]\n"
现在换成optional来试一下
var intOptionalNum : Int? = 5
switch intOptionalNum {
case .Some(1):
print("is 1")
case .Some(2...5):
print("is [2,5]")
default:
print("out range")
}
//正常
这个是有疑问的地方:
var intOptionalNum : Int? = 5
var intOptionalRange = Optional.Some(2...5)
var twoValueNum : Int? = 2
switch intOptionalNum {
case twoValueNum: //error1
print("is 2")
case intOptionalRange : //error2
print("in [2 5]")
default:
print("out range")
}
//error1: 下面注释掉的这里报错expression pattern of type 'Int?' cannot match values of type 'Int?' 天啦撸,哪里不一样了...
//error2: value of optional type 'Optional<Range<Int>>' not unwrapped; did you mean to use '!' or '?'?
var intOptionalNum2 : Optional<Int> = 5
var intOptionalRange2 : Range<Int>? = 2...5
var twoValueNum2 = Optional.Some(2)
// 这里的intOptionalNum 跟 intOptionalNum2 是一个东西吗?
// 请问这里的.Some(2...5) 跟 intOptionalRange 是一个东西吗?为什么不会识别?
另外一点有一些不适:
可空值的range表示我觉得 Range<Int?>更好。Range<Int>? 表示费解。
初入swift 提的问题可能有些纰漏,或者犯了低级错误。请大家见谅。3q。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不知道你是怎么学 Swift 的?
回答问题了
首先你拿一个 Optional 去 switch 是非常错误的。
第一个地方报错是因为
twoValueNum
与intOptionalNum
都是未解包状态。第二个地方报错同上。
.Some(2..5)
跟intOptionalRange
当然不是一个东西。.Some(2..5)
是对intOptionalNum
进行解包并匹配2..5
的情况。而intOptionalRange
本身是一个 Optional,包内是2..5
。Range<Int>? 表示的是 Range 本身可能为空或者有一个范围值。其次,不存在 Range<Int?> 的写法,尖括号内表示的是索引类型。举个栗子:你见过 Dictionary 中的 Key 是 nil 的吗?
总结:你完全没有搞清楚 Optional 是什么。而且下次问问题,写完问题自己看一眼,写的乌七八糟的别人想回答也没心情,要不是我帮你把问题重新排版了,我都看不懂。
PS: 要养成使用
let
的习惯,别动不动就用var
。不吭不响改了问题,这样真的好吗?
回答你的新问题:
一样
不一样。switch 中
case .Some(2..5)
是对上面值得解包操作,而intOptinalRange
则是一个 Optional。你的var intOptionalRange = Optional.Some(2...5)
只是创建了一个 Optinal 值。PS2: 要养成使用
let
的习惯,别动不动就用var
。