Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to refer to a global type from within a class that has a nested type with the same name?

I have a class declared at the global scope and another class with the same name that is nested within some class.

class Address {
    var someProperty: String?
}

class ThirdPartyAPI {
    class Address {
        var someOtherProperty: String?
        init(fromAddress address: Address) {
            self.someOtherProperty = address.someProperty
        }
    }
}

The question is: how can I refer to a global class instead of the inner one from its initialiser? In the example given I've got an error Value of type 'ThirdPartyAPI.Address' has no member 'someProperty', which means that compiler refers to the inner Address instead of a global one.

like image 346
Denis Kim Avatar asked Nov 25 '25 16:11

Denis Kim


2 Answers

Use typealias

class Address {
    var someProperty: String?
}

typealias GlobalAddress = Address

class ThirdPartyAPI {
    class Address {
        var someOtherProperty: String?
        init(fromAddress address: GlobalAddress) {
            self.someOtherProperty = address.someProperty
        }
    }
}
like image 98
Khanh Nguyen Avatar answered Nov 27 '25 08:11

Khanh Nguyen


You can refer to types uniquely by prepending the module name. So if

class Address {
    var someProperty: String?
}

is defined in "MySuperApp" then you can refer to it as MySuperApp.Address:

class ThirdPartyAPI {

    class Address {
        var someOtherProperty: String?
        init(fromAddress address: MySuperApp.Address) {
            self.someOtherProperty = address.someProperty
        }
    }
}

(But if you have a choice then try to avoid the ambiguity to make your code easier to understand.)

like image 26
Martin R Avatar answered Nov 27 '25 08:11

Martin R



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!