【问题标题】:Unwrapping with flatMap用 flatMap 展开
【发布时间】:2018-10-09 10:26:37
【问题描述】:

我想获取我知道存在的日期的工作日整数,如下所示:

let dayOfWeek =  Calendar.current.dateComponents([.weekday], from: row.date).weekday

但是,这会返回一个可选的,我正在尝试弄清楚如何避免强制打开它。

我的想法是:

let dayOfWeek = (row.date).compactMap( { Calendar.current.dateComponents([.weekday], from: $0).weekday!
})

但是这给了我错误“'Date'类型的值没有成员'compactMap'”

谁能告诉我我做错了什么,或者我应该如何解决这个问题?

【问题讨论】:

    标签: swift calendar swift4 optional nsdatecomponents


    【解决方案1】:

    不需要任何选项。很简单:

    let dayOfWeek = Calendar.current.component(.weekday, from: row.date)
    

    注意,flatMap 在这里不相关,因为row.date 不是可选的。但即使是这样,值得注意的是Optional 方法flatMap 的名称并没有改变。它仍然是flatMap。仅此名称的Sequence 方法已更改为compactMap

    Swift Evolution 0187: Introduce Sequence.compactMap(_:)


    所以,这仍然是flatMap

    let foo: Int? = 42
    let bar: String? = foo.flatMap { i -> String in
        return "The value is \(i)"
    }
    // Optional("The value is 42")
    

    注意,返回值是可选的String?。在您的示例中,您似乎正在尝试使用 flatMap 来解开您的可选项,但这不是 flatMap 的用途。如果它可以解开foo,则调用闭包,但如果不能解开,则返回nil。所以它只是返回另一个可选的(在我上面的例子中是String?)。

    在 Swift 4.1 中已重命名为 compactMapflatMapSequence 格式:

    let baz = ["1", "2", "x", "3"]
    
    let qux: [Int] = baz.compactMap { string -> Int? in
        return Int(string) // return integer value if it could convert it, return `nil` if not
    }
    // [1, 2, 3]
    

    为了让它更加混乱,flatMap 仍然与序列一起使用:

    let letters = ["a", "b", "c"]
    
    let quux = letters.map { Array(repeating: $0, count: 3) }
    // [["a", "a", "a"], ["b", "b", "b"], ["c", "c", "c"]]
    
    let quuz = letters.flatMap { Array(repeating: $0, count: 3) }
    // ["a", "a", "a", "b", "b", "b", "c", "c", "c"]
    

    【讨论】:

    • 感谢您的提示!如果我在这种情况下使用 flatMap,为什么我仍然会收到错误“'Date' 类型的值没有成员 'flatMap'”?
    • flatMap 是一种名为Optional 的方法。但row.date 显然不是可选的。所以在这种情况下使用它是没有意义的。坦率地说,无论如何,使用OptionalflatMap 方法通常通过使用可选链接来更好地完成。但是,如果您要使用它,这里有一个示例:let foo: Int? = 42; let bar = foo.flatMap { "The value is \($0)" } ?? "There is no value"
    【解决方案2】:

    在这种情况下,无需避免强制展开。虽然weekday 是可选的,但当您专门请求.weekday 组件时,它永远不会是nil

    let dayOfWeek = Calendar.current.dateComponents([.weekday], from: row.date).weekday!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2021-03-05
      • 2019-03-05
      • 1970-01-01
      • 2017-09-19
      • 2016-11-13
      相关资源
      最近更新 更多