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