我想得到我知道的日期的工作日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'”
有人可以告诉我我做错了什么,或者我该如何解决这个问题?
答案 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!