Home > database >  Swift: Can't access subclass properties in superclass array
Swift: Can't access subclass properties in superclass array

Time:01-24

In the following example, I have a class Parent and a subclass Child. Next, I create an array of type [Parent] and fill it with a Child,

When I print the type of the element in the array, it prints Child. However, when I try to access the name property of that element, I can't do so because the compiler says that element is of type Parent.

I understand that a Child is of type Parent, but why is the compiler presenting it differently in the different print statements? How would I be able to access the .name property of Child in the array?

class Parent { }

class Child: Parent {
    let name = "bob"
}

var arr: [Parent] = [ Child() ]

print(type(of: arr[0]))          // Prints: "Child()"
print(arr[0].name)               // error: value of type 'Parent' has no member 'name'

CodePudding user response:

type(of: arr[0]) is executed at the runtime, that's why it prints the type description as "Child". arr[0].name is executed at the compile time. Compiler only knows that arr is an array of Parent so only Parent properties are available.

CodePudding user response:

In the statement print(arr[0].name), the only type known for arr[0] is Parent, and Parent has no name property. You have to tell Swift to treat arr[0] as a Child if possible, using an as? cast:

print((arr[0] as? Child)?.name)

UPDATE

type(of: arr[0]) returns the dynamic (runtime) type of arr[0], by inspecting the reference object header of arr[0].

  • Related