Swift 我可以在'map'和'flatMap'函数中执行一些不'transfrom'的操作吗?

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函数应该返回一

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
时,他们有一个预先设想的期望,即它将进行转换。你违反了这个期望,但从技术上讲,这并没有什么“错误”

就个人而言,我更喜欢使用此扩展:

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