【问题标题】:Weird behavior using the Swift Optional type使用 Swift Optional 类型的奇怪行为
【发布时间】:2018-04-24 10:59:18
【问题描述】:

我在练习 Swift Optional 类型时发现了奇怪的(对我来说)行为。代码:

func returnOptionalIntFromString(_ val: String) -> Int? {
    return Int(val)
}

func returnIntFromString(_ val: String) -> Int {
    return Int(val) ?? 0
}

let optionalStr: String? = "10"
let mappedC1 = optionalStr.map(returnIntFromString)
let mappedC2 = optionalStr.map(returnOptionalIntFromString)
let flatMappedC1 = optionalStr.flatMap(returnIntFromString)
let flatMappedC2 = optionalStr.flatMap(returnOptionalIntFromString)

为什么要编译这行let flatMappedC1 = optionalStr.flatMap(returnIntFromString)?我将(String) -> Int 传递给接受(String) -> Optional<Int> 的函数,所以它一定是编译时错误?或者没有? :)

【问题讨论】:

    标签: swift generics optional


    【解决方案1】:

    编译器会特别处理选项。特别是,一个值 如果需要,T 类型的会自动包装到 Optional<T> 中:

    let a = 5
    let b: Int? = a
    

    这也适用于非可选和可选返回类型 闭包:

    let cla: () -> Int = { return 13 }
    let clb: () -> Int? = cla
    

    这就是发生的事情

    let flatMappedC1 = optionalStr.flatMap(returnIntFromString)
    

    【讨论】:

      【解决方案2】:

      我想我不得不说示例中的所有变量都是可选的

      let optionalStr: String? = "10"
      let mappedC1 = optionalStr.map(returnIntFromString)
      let mappedC2 = optionalStr.map(returnOptionalIntFromString)
      let flatMappedC1 = optionalStr.flatMap(returnIntFromString)
      let flatMappedC2 = optionalStr.flatMap(returnOptionalIntFromString)
      print(optionalStr, mappedC1, mappedC2, flatMappedC1, flatMappedC2)
      

      产量:

      Optional("10") Optional(10) Optional(Optional(10)) Optional(10) Optional(10)

      是的! “可选世界”来了! :)

      所以,let flatMappedC1 = optionalStr.flatMap(returnIntFromString) 应该这样读:

      如果optionalStr 不是 nil,让我们打开 "10" 并使用 flatMap 函数,其中 returnIntFromString 有非可选参数。函数returnIntFromString 返回Int,正如@MartinR 所说,它可以简单地转换为Int?。函数flatMap 产生Int?。如果optionalStr 为零,flatMappedC1 则为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2016-02-29
        • 2014-10-23
        • 2016-01-28
        相关资源
        最近更新 更多