While Implementing ApplePay, I noticed that each of the pre-defined PKPaymentNetwork (.visa, .amex, etc) are static let properties defined within a struct. In my opinion, this might cause misunderstanding, since we can initialize properties differently than Apple defines, for instance: PKPaymentNetwork(rawValue: "amex") will successfully create an "amex" property. The thing here is that even though we successfully created it, it will be different than the defined .amex (If we execute PKPaymentNetwork(rawValue: "amex") == PKPaymentNetwor.amex will be FALSE, since PKPaymentNetwork(rawValue: "AmEx") == PKPaymentNetwor.amex is TRUE). In other words: By using a struct, we can create instances of PKPaymentNetwork that will be unusable. My suggestion is to replace this struct with a enum, something like: enum PKPaymentNetwork: String, etc { case amex = "AmEx" } In this case, if a developer wants to instantiate a PKPaymentNetwork(rawValue: "amex" | "Amex" | "AMEX" ) will get NIL instead of an instance.