我可以在 `map` 和 `flatMap` 函数中做一些不是 `transform` 的事情吗?
Can I do something not `transfrom` in `map` and `flatMap` function?
Optional
在Swift中的Map
功能是不是刚用在transform
上?
如果我想做某事只是 Optional 有一些价值,我可以使用 map
功能吗?如果不是,为什么?
根据苹果的例子,我们这样使用map
let possibleNumber: Int? = Int("42")
possibleNumber.map { [=10=] * [=10=] }
我可以这样用吗? : (如有不妥,如何解释)
func setImage(with data: Data?) {
data.flatMap { UIImage(data: [=11=]) }
.map { imageView.image = [=11=] }
}
另外map
函数应该return一个值,但是为什么这个函数没有任何warning
未使用的结果(比如result of call map{...} is unused
)?
你当然可以做到,只是不太传统。当人们看到 map
时,他们会先入为主地期待它会进行转换。您违反了该期望,但从技术上讲 "wrong" 没有任何问题。
就个人而言,我更喜欢使用此扩展程序:
extension Optional {
/// An enum used to ensure that `ifNone` is never called before `ifSome`.
enum IfSomeResult {
case some
case none
func ifNone(_ closure: () throws -> Void) rethrows -> Void {
switch self {
case .some: return
case .none: try _ = closure()
}
}
}
@discardableResult
func ifSome(then closure: (Wrapped) throws -> Void) rethrows -> IfSomeResult {
if let wrapped = self {
try _ = closure(wrapped)
return IfSomeResult.some
}
else {
return IfSomeResult.none
}
}
func ifNone(then closure: () throws -> Void) rethrows -> Void {
if case nil = self { try _ = closure() }
}
}
并编写如下代码:
data.flatMap { UIImage(data: [=11=]) }
.ifSome { imageView.image = [=11=] }
为什么它不警告未使用的值?
闭包被推断为return Void
(空元组类型,其唯一值是空元组,()
)。编译器从不发出有关 Void
值未使用的警告。这是一个例子:
Optional(123).map { _ in () }
Optional
在Swift中的Map
功能是不是刚用在transform
上?
如果我想做某事只是 Optional 有一些价值,我可以使用 map
功能吗?如果不是,为什么?
根据苹果的例子,我们这样使用map
let possibleNumber: Int? = Int("42")
possibleNumber.map { [=10=] * [=10=] }
我可以这样用吗? : (如有不妥,如何解释)
func setImage(with data: Data?) {
data.flatMap { UIImage(data: [=11=]) }
.map { imageView.image = [=11=] }
}
另外map
函数应该return一个值,但是为什么这个函数没有任何warning
未使用的结果(比如result of call map{...} is unused
)?
你当然可以做到,只是不太传统。当人们看到 map
时,他们会先入为主地期待它会进行转换。您违反了该期望,但从技术上讲 "wrong" 没有任何问题。
就个人而言,我更喜欢使用此扩展程序:
extension Optional {
/// An enum used to ensure that `ifNone` is never called before `ifSome`.
enum IfSomeResult {
case some
case none
func ifNone(_ closure: () throws -> Void) rethrows -> Void {
switch self {
case .some: return
case .none: try _ = closure()
}
}
}
@discardableResult
func ifSome(then closure: (Wrapped) throws -> Void) rethrows -> IfSomeResult {
if let wrapped = self {
try _ = closure(wrapped)
return IfSomeResult.some
}
else {
return IfSomeResult.none
}
}
func ifNone(then closure: () throws -> Void) rethrows -> Void {
if case nil = self { try _ = closure() }
}
}
并编写如下代码:
data.flatMap { UIImage(data: [=11=]) }
.ifSome { imageView.image = [=11=] }
为什么它不警告未使用的值?
闭包被推断为return Void
(空元组类型,其唯一值是空元组,()
)。编译器从不发出有关 Void
值未使用的警告。这是一个例子:
Optional(123).map { _ in () }