It applies in theory to think Optional as a collect of one and for that reason
map is a perfect name.
But in practice, we often use the same variable name for array and array? . So
when you see :
cars.map({...$0...})
You can not tell which map and even worse which $0 it is.
According to Swift API Design Guidelines #1, Clarity at the point of use.
And to combine theory and practice, I propose mapUnwrapped to remove the
confusion.
Actually this is what’s been adopted in my company:
public extension Optional {
/// Pass the `Optional` into the closure that returns `Non-Optional`
public func mapUnwrapped<U>(_ transform: (Wrapped) throws -> U) rethrows ->
U? {
return try map(transform)
}
}
To summary my idea:
This is the situation where usability > design purity for a language(a tool).
> On 7 Dec 2016, at 08:05, Robert Widmann <[email protected]> wrote:
>
> If you think of Optional as a zero-or-one element collection there's really
> no reason this operation should be named any differently. It still lifts a
> function over values to one over Optionals. It still extracts the contents
> of the structure and applies the function (propagating failure if necessary).
> The operation is no different from the one required of a plain Sequence
> conformance, why should it have a new name if it is not a new operation?
>
> ~Robert Widmann
>
> 2016/12/05 22:46、Jay Zhao via swift-evolution <[email protected]
> <mailto:[email protected]>> のメッセージ:
>
>> Hi there,
>>
>> Code explains everything:
>>
>>
>>
>> /// Maybe a bad API naming in Swift? See below:
>>
>> /// array1 can be array of any object that have a `count` method
>> let array1 = [[String]]()
>> let array2 :[String]? = nil
>>
>>
>> // I believe the confusion between `array.map` and
>> `optionalArray.map` is really bad.
>> // Because when you read code like this, you can not tell which is
>> which:
>> _ = array1.map({$0.count})
>> _ = array2.map({$0.count})
>>
>> // It can be clearer:
>> // 1, we pass `self.element` into the closure
>> _ = array1.map({$0.count})
>> // 2, we pass self directly into the closure
>> _ = array2.mapMe({$0.count})
>>
>>
>> The mapFlat method is also problematic.
>>
>> Yours,
>> Jay Zhao
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution