Ext Optional {
 Func ifUnwraps<T>(_ h: T->()){
  Switch self
    Case .Some(let v):
      If let t=v as? T { h(t) } // invoke if T matches
    Def:
      Brk
 }
Regards
LM
(From mobile)

> On Jun 22, 2016, at 9:15 AM, L. Mihalkovic <laurent.mihalko...@gmail.com> 
> wrote:
> 
> Func asOpt<T>(v:Any) -> Optional<T> {
>   If let val = v as? T {
>     Return val
>   }
>   Return nil
> }
> Regards
> LM
> (From mobile)
> 
>> On Jun 22, 2016, at 7:11 AM, Charlie Monroe via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> Unfortunately, this is not as easy, because automatic bridging won't be 
>> applied:
>> 
>> let myString: String? = "Hello"
>> let anyValue: Any = myString
>> 
>> myString as? AnyObject // _NSContiguousString
>> anyValue as? AnyObject // nil, since String is struct
>> 
>> let array: [String]? = ["Hello"]
>> let anyArray: Any = array
>> anyArray as? AnyObject // nil
>> anyArray as? [AnyObject] // nil
>> array as? AnyObject // ["Hello"]
>> 
>> And this goes for strings, arrays, dictionaries and possibly other types. 
>> Which means that you need to handle manually all of the bridging to ObjC 
>> types, which has really grown in Swift 3, taking into account all the 
>> Foundation types that are now structs.
>> 
>> Should this then be considered compiler bug that bridging isn't taken into 
>> account?
>> 
>> Nevertheless, I'd still find it useful exposing the isOptional() function as 
>> well as the asOptional which would allow a cast from Any to Optional<Any> 
>> which is not possible at all at this moment since any such cast will pick up 
>> the Optional first:
>> 
>> let myString: String? = "Hello"
>> let anyValue: Any = myString
>> if let value = anyValue as? Any {
>>     value.dynamicType // This is still Optional<String>, not naively just 
>> the value of the optional
>> }
>> 
>> 
>> 
>>> On Jun 21, 2016, at 8:18 PM, Joe Groff <jgr...@apple.com> wrote:
>>> 
>>> 'as?' should already do this. If you have an Any that contains an 
>>> Optional<T> and cast 'any as? T', you'll get the value inside the Optional 
>>> if there is one, or the cast will fail if the optional is nil or the type 
>>> doesn't match.
>>> 
>>> -Joe
>>> 
>>>> On Jun 20, 2016, at 11:00 PM, Charlie Monroe via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> I've recently written a CoreData editor on iOS which automatically 
>>>> generates UI based on the model which is described using classes such as 
>>>> PrimitiveProperty, etc. Since it automatically sets the value on the 
>>>> entity, it needs to convert the value to AnyObject in order to pass it to 
>>>> setValue(_:forKey:), so it needs to be able to detect whether the value is 
>>>> Optional and in case it is, either transform the non-nil value to 
>>>> AnyObject (String -> NSString, Array -> NSArray, ...). Which is currently 
>>>> really hard to achieve: 
>>>> 
>>>> var obj: IndexPath? = IndexPath()
>>>> let anyValue: Any = obj
>>>> anyValue.dynamicType /// Optional<Foundation.IndexPath>.Type
>>>> 
>>>> /// Using only anyValue, determine if it's Optional and retrieve its value 
>>>> if 
>>>> /// non-nil as AnyObject.
>>>> func isOptional(anyValue: Any) -> Bool {
>>>>    // Error: Cannot downcast from 'Any' (aka 'protocol<>') to a more 
>>>>    // optional type 'Optional<_>'
>>>>    return anyValue is Optional
>>>>    return anyValue as? Optional != nil
>>>>    ...
>>>> }
>>>> 
>>>> Unless there are major reasons why it's not exposed, I'd propose 
>>>> introducing a new function isOptional(anyValue: Any) -> Bool, which would 
>>>> simply call Builtin.isOptional just like _isOptional does in 
>>>> Builtin.swift. (which pretty much is just taking the current _isOptional, 
>>>> removing underscore and marking it public).
>>>> 
>>>> However, this still doesn't help with the issue of retrieving the value of 
>>>> the Optional. You now know the value in `anyValue` is Optional, but there 
>>>> is no good way to cast it to e.g. Optional<AnyObject>. Here we're getting 
>>>> into a vicious cycle that Any can be an Optional which is Any.
>>>> 
>>>> My second part of the proposal introduces another function:
>>>> 
>>>> func asOptional<T>(anyValue: Any) -> Optional<T>?
>>>> 
>>>> Which will:
>>>> - return nil if !isOptional(anyValue)
>>>> - return a non-nil value only if `anyValue` contains in fact an Optional 
>>>> of type T.
>>>> 
>>>> Usage:
>>>> 
>>>> if let anyObjOptional: AnyObject? = asOptional(anyValue: anyValue) {
>>>>    if let anyObj = anyObjOptional {
>>>>        // anyObj is now the actual content of the optional.
>>>>    }
>>>> }
>>>> 
>>>> As a sidenote, this is my current workaround:
>>>> 
>>>> private protocol _XUOptional {
>>>>    var objectValue: AnyObject? { get }
>>>> }
>>>> 
>>>> extension Optional: _XUOptional {
>>>>    var objectValue: AnyObject? {
>>>>        switch self {
>>>>        case .None:
>>>>            return nil
>>>>        case .Some(_):
>>>>            return self! as? AnyObject
>>>>        }
>>>>    }
>>>> }
>>>> 
>>>> if let optional = anyValue as? _XUOptional {
>>>>    let object = optional.objectValue
>>>>    /// ...
>>>> }
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to