Swift 我可以在'map'和'flatMap'函数中执行一些不'transfrom'的操作吗?
Swift中的Swift 我可以在'map'和'flatMap'函数中执行一些不'transfrom'的操作吗?,swift,dictionary,optional,Swift,Dictionary,Optional,Swift中的Map功能是否仅用于转换 如果我想做一些有价值的可选的事情,我可以使用map函数吗?若否,原因为何 根据苹果的例子,我们使用map如下 let possibleNumber:Int?=Int(“42”) possibleNumber.map{$0*$0} 我可以这样用吗(如果不合适,如何解释) func setImage(带数据:数据?){ data.flatMap{UIImage(数据:$0)} .map{imageView.image=$0} } 此外,map函数应该返回一
Map
功能是否仅用于转换
如果我想做一些有价值的可选的事情,我可以使用map
函数吗?若否,原因为何
根据苹果的例子,我们使用map
如下
let possibleNumber:Int?=Int(“42”)
possibleNumber.map{$0*$0}
我可以这样用吗(如果不合适,如何解释)
func setImage(带数据:数据?){
data.flatMap{UIImage(数据:$0)}
.map{imageView.image=$0}
}
此外,map
函数应该返回一个值,但是为什么这个函数没有任何关于结果未使用的警告(例如调用map{…}的结果未使用
)?你当然可以这样做,这不是很常规。当人们看到map
时,他们有一个预先设想的期望,即它将进行转换。你违反了这个期望,但从技术上讲,这并没有什么“错误”
就个人而言,我更喜欢使用此扩展:
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: $0) }
.ifSome { imageView.image = $0 }
为什么它不警告未使用的值?
闭包被推断为返回Void
(空元组类型,其唯一值是空元组,()
)。编译器从不发出关于Void
值未使用的警告。下面是一个例子:
Optional(123).map { _ in () }
忽略示例的第一个代码,我不知道第二个代码是否正确。为什么不将setImage
实现为:imageView.image=data.map{UIImage(data:$0)}
@rmaddy这只是一个示例代码。。如果imageView
需要一个非空的UIImage
?“如果我想做一些事情,Optional
有一些值,我可以使用map
函数吗?”。。。你可以,但不应该。它是用来转换值的,在文档中被列为这样,整个概念来自函数式语言,在那里永远不会有副作用。您的示例很简单,但是考虑更复杂的闭包,副作用可能不那么明显。如果你完全避免了这一点,你(和你的团队的其他成员)会感谢你自己,让你的代码更容易被推理。另一种思考方法:考虑类似的<代码> MAP<代码> > <代码>数组< /> >:如果它打算用它来做带有副作用的代码,他们永远不会提供一个forEach
方法。当编写代码时,如果让
在转换之外做任何事情,请坚持使用选项模式。谢谢您的回答。如何解释它没有任何关于我没有使用'map'结果的警告?@Alexander,此外,我认为这个问题也是关于为什么map
方法没有显示调用map{}unused的警告结果。map函数是@inlineable
,但我看不到@discardablesult
。(我也开始对答案感兴趣了)imageView.image=data.map{UIImage(data:$0)}
非常简单,不需要扩展。@rmaddy是的,最佳选择取决于所需的确切语义。您发布的最新代码还有另一个语义区别,即它触发didSet
/willSet
观察者,即使该值没有changed@LokSN这是因为它不是关键字:)“Wrapped”是Optional唯一泛型类型参数的名称。为了简洁起见,我们通俗地使用T
,比如说Optional
或Array
,而这些情况下的实际泛型类型名称是Optional
和Array