swift 可空类型的switch使用

发布于 2022-09-02 11:57:13 字数 1484 浏览 21 评论 0

当前版本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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

单挑你×的.吻 2022-09-09 11:57:13

不知道你是怎么学 Swift 的?

回答问题了

  1. 首先你拿一个 Optional 去 switch 是非常错误的。

  2. 第一个地方报错是因为 twoValueNumintOptionalNum 都是未解包状态。

  3. 第二个地方报错同上。

  4. .Some(2..5)intOptionalRange 当然不是一个东西。.Some(2..5) 是对 intOptionalNum 进行解包并匹配 2..5 的情况。而 intOptionalRange 本身是一个 Optional,包内是 2..5

  5. Range<Int>? 表示的是 Range 本身可能为空或者有一个范围值。其次,不存在 Range<Int?> 的写法,尖括号内表示的是索引类型。举个栗子:你见过 Dictionary 中的 Key 是 nil 的吗?

总结:你完全没有搞清楚 Optional 是什么。而且下次问问题,写完问题自己看一眼,写的乌七八糟的别人想回答也没心情,要不是我帮你把问题重新排版了,我都看不懂。

PS: 要养成使用 let 的习惯,别动不动就用 var


不吭不响改了问题,这样真的好吗?

这里的intOptionalNum 跟 intOptionalNum2 是一个东西吗?
请问这里的.Some(2...5) 跟 intOptionalRange 是一个东西吗?为什么不会识别?

回答你的新问题:

  1. 一样

  2. 不一样。switch 中 case .Some(2..5) 是对上面值得解包操作,而 intOptinalRange 则是一个 Optional。你的 var intOptionalRange = Optional.Some(2...5) 只是创建了一个 Optinal 值。

PS2: 要养成使用 let 的习惯,别动不动就用 var

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文