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

Reply via email to