新手问一个 Swift 可选类型解值的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
infinityv

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

  •  
  •   infinityv 2022 年 1 月 26 日 1257 次点击
    这是一个创建于 1549 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 年 1 月 26 日 via iPhone
    if let 应该是 pattern matching
    和 rust 一样
    zjddp
        2
    zjddp  
       2022 年 1 月 26 日
    !运算符修饰后原类型变成 Optional<String>,if let 是可选值绑定,我一般理解成 if (x != nil) { x do something } 的简化写法
    CommandZi
        3
    CommandZi  
       2022 年 1 月 26 日   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 年 1 月 26 日
    @CommandZi enum Option<Value> -> enum Optional <Value>
    MakHoCheung
        5
    MakHoCheung  
       2022 年 1 月 26 日
    你应该关注的是`隐式解析可选类型`,assumedString 其实还是可选类型 String? ,只是在使用 assumedString 不需要 ! 来解包,因为你用 String! 来声明这个可选类型是有值的。
    这个时候又有一个疑问就是为什么不直接用 String ,因为某些情况下可能就是要声明变量是可选类型
    infinityv
        6
    infinityv  
    OP
       2022 年 1 月 26 日 via iPhone
    @MakHoCheung 嗯 隐试解析其实就是普通的可选类型,这个明白。我举的例子用隐式解析会有点误导性质,这个问题和隐式不隐式没啥关系。实际上问题是“可选类型的值为啥只能用 if let 直接取出来” 楼上回答可能解释了 我看看先
    CommandZi
        8
    CommandZi  
       2022 年 1 月 26 日   1
    let assumedString: String? 或者 let assumedString: String!
    实际上是真正的代码是
    let assumedString: Optional<String>

    这是一个名称是 Optional 的枚举,并不是「 Optional 标识」,这个搞清楚就很容易理解了,这里这个问号、叹号也是语法糖。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3004 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 03:29 PVG 11:29 LAX 20:29 JFK 23:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86