使用Swift Optional类型时遇到的异常行为问题
解析Swift Optional中map与flatMap的差异
嘿,我来帮你拆解这段代码里map和flatMap对Optional的不同表现——这确实是Swift初学者容易踩的一个坑,咱们一步步来看:
首先先把你的代码贴出来方便参考:
func returnOptionalIntFromString(_ val: String) -> Int? { return Int(val) } func returnIntFromString(_ val: String) -> Int { return Int(val) ?? 0 } let optionalStr: String? = "10" let mappedC1 = optionalStr.map(returnIntFromString) let mappedC2 = optionalStr.map(returnOptionalIntFromString) let flatMappedC1 = optionalStr.flatMap(returnIntFromString) let flatMappedC2 = optionalStr.flatMap(returnOptionalIntFromString)
接下来逐个分析四个变量的类型和值:
1. mappedC1
- 类型:
Int? - 值:
.some(10) - 原因:
map对Optional的逻辑是:如果原Optional有值(这里optionalStr是.some("10")),就把值传给传入的函数,然后把函数的返回值再包装成一层Optional。returnIntFromString("10")返回10(非Optional的Int),所以map会把它包装成Int?。
2. mappedC2
- 类型:
Int??(可选的可选Int) - 值:
.some(.some(10)) - 原因:同样是
map,但传入的returnOptionalIntFromString返回的是Int?。map会把这个返回值再包装一层Optional,所以最终变成了两层嵌套的Optional。如果optionalStr是nil,那mappedC2会直接是nil(外层的Optional为none)。
3. flatMappedC1
- 类型:
Int? - 值:
.some(10) - 原因:
flatMap对Optional的逻辑是:如果原Optional有值,把值传给函数后,直接返回函数的返回值,但会自动处理Optional的嵌套。这里returnIntFromString返回的是非Optional的Int,Swift会自动把它包装成Int?,所以最终结果和mappedC1一致。
4. flatMappedC2
- 类型:
Int? - 值:
.some(10) - 原因:这才是
flatMap最核心的作用——处理返回Optional的函数。returnOptionalIntFromString("10")返回Int?(10),flatMap会把这层嵌套的Optional“展开”,直接返回单层的Int?。如果returnOptionalIntFromString返回nil(比如传入非数字字符串),那flatMappedC2也会是nil。
核心总结
对Optional类型来说:
map:总是会把变换后的结果再包装一层Optional,不管变换函数返回的是不是Optional。flatMap:如果变换函数返回的是Optional,会自动“扁平化”成单层Optional;如果返回的是非Optional,效果和map一致(都会包装成单层Optional)。
内容的提问来源于stack exchange,提问作者Bohdan Savych
相关产品推荐
相关产品推荐

