用flatMap展开

时间:2018-04-28 22:31:51

标签: swift calendar swift4 optional nsdatecomponents

我想得到我知道的日期的工作日int这样:

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

然而,这会返回一个可选项,我正在试图弄清楚如何避免强行展开它。

我的意思是:

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

然而,这给了我错误“类型'Date'的值没有成员'compactMap'”

有人可以告诉我我做错了什么,或者我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

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中重命名为flatMap的{​​{1}}是compactMap版本:

Sequence

为了让它更加混乱,仍然有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

答案 1 :(得分:1)

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

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