stripe / stripe-ios

Stripe iOS SDK
https://stripe.com
MIT License
2.12k stars 981 forks source link

Unable to subclass STPPaymentCardTextField #1768

Closed mvarie closed 3 years ago

mvarie commented 3 years ago

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

csabol-stripe commented 3 years ago

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

marcelofabri commented 3 years ago

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

davidme-stripe commented 3 years ago

This should be fixed in 21.4.0.

marcelofabri commented 3 years ago

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

davidme-stripe commented 3 years ago

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

BaluNaik commented 3 years ago

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

abusetrouble commented 3 years ago

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?

davidme-stripe commented 3 years ago

Please try 21.5.0, this should be fixed.

BaluNaik commented 3 years ago

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
marcelofabri commented 3 years ago

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

BaluNaik commented 3 years ago

@davidme-stripe Any update on this?