Skip to content

[SR-5331] Swift 4 Decodable Loses Subclass Type Information #47905

Closed
@swift-ci

Description

@swift-ci
Previous ID SR-5331
Radar https://bugreport.apple.com/web/?problemID=32911973
Original Reporter jnozzi (JIRA User)
Type Bug
Status Resolved
Resolution Invalid

Attachment: Download

Environment

Swift 4, Xcode 9 (betas 1 and 2), macOS 10.13 (betas 1 and 2).

Additional Detail from JIRA
Votes 0
Component/s Standard Library
Labels Bug
Assignee None
Priority Medium

md5: cb8ce6d42a452adfc03b7acb6f106963

is duplicated by:

  • SR-5381 Codable with array of base class

Issue Description:

Decoding an Array<Superclass> that contains a heterogenous mix of Superclass and Subclass: Superclass incorrectly infers all members to be of type Superclass, thereby breaking decoding as Subclass.init(from🙂 is never called.

Steps to Reproduce:
Assuming a class Superclass: Codable and class Subclass: Superclass, where Superclass has a var children: [Superclass], a round trip through an encoder/decoder of any type loses the subclass type information of any Subclass instances in the children array (they are all assumed to be Superclass). This breaks decoding of Subclass because the subclass' overridden init(from🙂 is never called since it's incorrectly assumed to be of type Superclass. Demonstration playground attached.

Expected Results:
When an encoded Array<Superclass> with heterogenous mix of Superclass and Subclass: Superclass is decoded, I expect the type information to be preserved so that instances of Subclass have their init(from🙂 called.

Observed Results:
In the attached simplified Playground example, the line:

let firstDecodedChild = decodedRoot.children.first as? Subclass

...evaluates to nil because the as? fails to cast what it assumes to be a Superclass instance to a Subclass. If you remove the as? you get an instance of Superclass.

In a more complex model with more properties, you get complaints about keys not being found, presumably because the Decoders are not descending into the Subclass instances' "super" containers as it thinks it has everything it needs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.standard libraryArea: Standard library umbrella

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions