V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
infinityv
V2EX  ›  问与答

新手问一个 Swift 可选类型解值的问题

  •  
  •   infinityv · 2022-01-26 11:36:59 +08:00 · 821 次点击
    这是一个创建于 814 天前的主题,其中的信息可能已经有所发展或是发生改变。
    let assumedString: String! = "An implicitly unwrapped optional string."
    
    //let implicitString: String = assumedString  // 不需要感叹号
    
    if let test1 = assumedString {	
    print(test1)	
    //输出 An implicitly unwrapped optional string.
    }
    
    let test2 = assumedString
    print(test2)		
    //输出  Optional("An implicitly unwrapped optional string.")
    

    最近在入门 Swift 看到 [隐式解析可选类型] 这里 有个不太明白的点

    上面这个例子 为啥在 if 语句的 body 里面才能输出可选类型的实际值 而普通的赋值只能输出可选类型(我理解就是带 Optional 标识

    if 能够直接 unwrap 一个可选类型的值是什么语法糖吗

    (这里我用的是隐式的可选类型 普通的可选类型应该也是一样)

    8 条回复    2022-01-26 13:45:57 +08:00
    Leviathann
        1
    Leviathann  
       2022-01-26 11:44:46 +08:00 via iPhone
    if let 应该是 pattern matching
    和 rust 一样
    zjddp
        2
    zjddp  
       2022-01-26 12:07:48 +08:00
    !运算符修饰后原类型变成 Optional<String>,if let 是可选值绑定,我一般理解成 if (x != nil) { x do something } 的简化写法
    CommandZi
        3
    CommandZi  
       2022-01-26 12:08:16 +08:00   ❤️ 1
    看这里
    https://developer.apple.com/documentation/swift/optional
    因为 Swift 里面 Optional 实际上是个包含范型的枚举,它的代码类似
    enum Option<Value> {
    case some(Value)
    case none
    }


    所以你的 if let 语句
    if let test1 = assumedString { }

    实际上等价于
    if case .some(let test1) = greeting {
    print(test1)
    }

    也等价于
    switch greeting {
    case .some(let value):
    print(value)
    case .none:
    break
    }

    在这里 if let 就是语法糖
    CommandZi
        4
    CommandZi  
       2022-01-26 12:09:24 +08:00
    @CommandZi enum Option<Value> -> enum Optional <Value>
    MakHoCheung
        5
    MakHoCheung  
       2022-01-26 12:22:59 +08:00
    你应该关注的是`隐式解析可选类型`,assumedString 其实还是可选类型 String? ,只是在使用 assumedString 不需要 ! 来解包,因为你用 String! 来声明这个可选类型是有值的。
    这个时候又有一个疑问就是为什么不直接用 String ,因为某些情况下可能就是要声明变量是可选类型
    infinityv
        6
    infinityv  
    OP
       2022-01-26 12:48:24 +08:00 via iPhone
    @MakHoCheung 嗯 隐试解析其实就是普通的可选类型,这个明白。我举的例子用隐式解析会有点误导性质,这个问题和隐式不隐式没啥关系。实际上问题是“可选类型的值为啥只能用 if let 直接取出来” 楼上回答可能解释了 我看看先
    CommandZi
        8
    CommandZi  
       2022-01-26 13:45:57 +08:00   ❤️ 1
    let assumedString: String? 或者 let assumedString: String!
    实际上是真正的代码是
    let assumedString: Optional<String>

    这是一个名称是 Optional 的枚举,并不是「 Optional 标识」,这个搞清楚就很容易理解了,这里这个问号、叹号也是语法糖。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5238 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:11 · PVG 15:11 · LAX 00:11 · JFK 03:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.