You can try upcasting the value to NSObject first, and then performing a 
conditional downcast to Controller1 and Controller2. At this point the type 
checker will not have enough information to decide that the cast always fails, 
and should no longer emit a warning.

Slava

> On Oct 6, 2017, at 11:55 PM, Glen Huang <hey...@gmail.com> wrote:
> 
> Done, https://bugs.swift.org/browse/SR-6083 
> <https://bugs.swift.org/browse/SR-6083>
> 
> In the mean time, is there any workaround? Or it’s not possible to check the 
> concrete type without this issue being fixed?
> 
>> On 7 Oct 2017, at 2:44 PM, Slava Pestov <spes...@apple.com 
>> <mailto:spes...@apple.com>> wrote:
>> 
>> Oh I see. I think the problem is that with Objective-C generics, you can 
>> always cast from Foo<A> to Foo<B>, because the type parameters do not really 
>> exist. Swift’s type checking logic for casts assumes Swift generic 
>> semantics, where in general Foo<A> and Foo<B> are unrelated types.
>> 
>> Do you mind filing a bug?
>> 
>> Slava
>> 
>>> On Oct 6, 2017, at 11:40 PM, Glen Huang <hey...@gmail.com 
>>> <mailto:hey...@gmail.com>> wrote:
>>> 
>>> NSFetchedResultsController is the class from Core Data: 
>>> 
>>> https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller
>>>  
>>> <https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller>
>>> 
>>>> On 7 Oct 2017, at 2:38 PM, Slava Pestov <spes...@apple.com> wrote:
>>>> 
>>>> Can you post a self-contained example, including the declaration of 
>>>> NSFetchedResultsController?
>>>> 
>>>> Slava
>>>> 
>>>>> On Oct 6, 2017, at 11:28 PM, Glen Huang via swift-users 
>>>>> <swift-users@swift.org> wrote:
>>>>> 
>>>>> Hi,
>>>>> 
>>>>> I defined some concrete classes inheriting from a generic class like this:
>>>>> 
>>>>> class Controller1: NSFetchedResultsController<NSManagedObject> {}
>>>>> class Controller2: NSFetchedResultsController<NSManagedObject> {}
>>>>> 
>>>>> And I assign them a shared delegate, and in the delegate method:
>>>>> 
>>>>> func controllerWillChangeContent(_ controller: 
>>>>> NSFetchedResultsController<NSFetchRequestResult>)
>>>>> 
>>>>> I want to test the concrete type of controller, doing things differently 
>>>>> for Controller1 and Controller2.
>>>>> 
>>>>> But doing the following gives me a warning: Cast from 
>>>>> 'NSFetchedResultsController<NSFetchRequestResult>' to unrelated type 
>>>>> 'Controller1’ always fails
>>>>> 
>>>>> switch controller {
>>>>> case is Controller1:
>>>>>     // ...
>>>>> default:
>>>>>     break
>>>>> }
>>>>> 
>>>>> I wonder what’s the correct way to check the concrete type?
>>>>> 
>>>>> Regards,
>>>>> Glen
>>>>> _______________________________________________
>>>>> swift-users mailing list
>>>>> swift-users@swift.org
>>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>> 
>>> 
>> 
> 

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to