Stripe-ios: Unable to subclass STPPaymentCardTextField

Created on 2 Mar 2021  ·  10Comments  ·  Source: stripe/stripe-ios

Summary


It seems that it is now impossible to subclass STPPaymentCardTextField.

The compile-time error is:

Cannot inherit from non-open class ‘STPPaymentCardTextField’ outside of its defining module

This also makes it impossible to override in a subclass methods that are intended to be overridden by design, such as brandImageForCardBrand, cvcImageForCardBrand, errorImageForCardBrand and others.

Stripe Reference > STPPaymentCardTextField Class Reference > brandImageForCardBrand:
Stripe Reference > STPPaymentCardTextField Class Reference > cvcImageForCardBrand:
Stripe Reference > STPPaymentCardTextField Class Reference > errorImageForCardBrand:

Code to reproduce


class MYPaymentCardTextField: STPPaymentCardTextField{}

Cannot inherit from non-open class ‘STPPaymentCardTextField’ outside of its defining module

iOS version

14.4

Installation method

Swift Package Manager

SDK version


21.3.1

Other information


It didn't happen with SDK version 20.1.1 (which was still objc apparently), it started happening when upgrading from 20.1.1 to 21.3.1.

Class in swift file is marked as public, but it should be probably marked as open. Emphasis mine:

Open access applies only to classes and class members, and it differs from public access by allowing code outside the module to subclass and override, as discussed below in Subclassing. Marking a class as open explicitly indicates that you’ve considered the impact of code from other modules using that class as a superclass, and that you’ve designed your class’s code accordingly.

Source: The Swift Programming Language - Access Control

triaged

Most helpful comment

Thanks for the report @mvarie, I've got a fix for this that we'll include in the next release

All 10 comments

Thanks for the report @mvarie, I've got a fix for this that we'll include in the next release

@csabol-stripe Thanks for looking at this! Is there a timeline for the next release? 🙏

This should be fixed in 21.4.0.

21.4.0 doesn't fix it though: https://github.com/stripe/stripe-ios/commit/fbd12ae891462b8896e53454610f68921b0d73ef only made the class open, but we need the specific methods to be open as well

Sorry, we totally missed that. :( We'll issue another update very soon.

@devesh-stripe When we can expect the next release with this fix?

If I try to subclass this I get exc_bad_access in delegate etc. Is it possible to allow to completely subclass (remove brand image view for example, add floating label) in future releases?

Please try 21.5.0, this should be fixed.

Hey @davidme-stripe
It seems the issue fixed partially, there are few more methods that are not allowing to override.

override func brandImageRect(forBounds bounds: CGRect) -> CGRect

Screen Shot 2021-05-09 at 11 15 07 AM

Yeah, we also need to override brandImageRect which was previously overridable.

Was this page helpful?
0 / 5 - 0 ratings