Skip to content

Commit fb6be09

Browse files
Add new StoredCardInputView UI (Screen only) nothing connected (#2458)
The first screen in the stored card flow. - Adding the StoredCardInput ViewController and ViewModel. (This isn't final yet) but tweaks will do it later. - Moved CardImageView from `AdyenDropIn` to `AdyenUI` (Added some additional tests here) - so these lines are not counted as changed in this MR ;) ## Some stats **Actual functional code**: Only 487 lines (42% of total) **Test**: 684 lines (58% of total) ## In the next MR, - Will try to connect this and display and remove the StoredAlertManager. - Also todos which i will keep adding on this topic. ## Checklist [Required] <!-- Mark completed items with an [x] --> - [x] Tested changes locally - [x] Added/updated unit test How it will look when connected. But not with only this PR. ![Simulator Screen Recording - co-v6-(16+,26 1) - 2026-02-26 at 16 20 36](https://github.com/user-attachments/assets/b5542580-e025-48e7-9482-794e26635ea6)
2 parents ad4a0f9 + 3c64c41 commit fb6be09

14 files changed

Lines changed: 1260 additions & 33 deletions

File tree

Adyen.xcodeproj/project.pbxproj

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 54;
6+
objectVersion = 70;
77
objects = {
88

99
/* Begin PBXAggregateTarget section */
@@ -239,9 +239,11 @@
239239
00FAE54E2B21CE1B0059A6F5 /* TwintDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00FAE54D2B21CE1B0059A6F5 /* TwintDetails.swift */; };
240240
00FFD8F02A865BFB008D4A5A /* ApplePaySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00FFD8EF2A865BFB008D4A5A /* ApplePaySettingsView.swift */; };
241241
00FFD8F12A865BFB008D4A5A /* ApplePaySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00FFD8EF2A865BFB008D4A5A /* ApplePaySettingsView.swift */; };
242-
210920742F362C4F0014DD55 /* CardImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210920722F362C4F0014DD55 /* CardImageView.swift */; };
243242
210920772F362D0F0014DD55 /* PreselectedPaymentMethodIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210920752F362D0F0014DD55 /* PreselectedPaymentMethodIntegrationTests.swift */; };
244243
21099B0D2CB7276E0096502C /* PaymentInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21099B0C2CB7276E0096502C /* PaymentInfo.swift */; };
244+
211BBD662F6C4F6700EF2172 /* CardImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211BBD652F6C4F6700EF2172 /* CardImageView.swift */; };
245+
211BBD712F6C4FDD00EF2172 /* StoredCardInputViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211BBD702F6C4FDD00EF2172 /* StoredCardInputViewModelTests.swift */; };
246+
211BBD732F6C905100EF2172 /* StoredCardInputViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211BBD722F6C904800EF2172 /* StoredCardInputViewControllerTests.swift */; };
245247
2144A4162F3A8D1400CCD7F8 /* AdyenUIImages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2144A4152F3A8D1400CCD7F8 /* AdyenUIImages.swift */; };
246248
2144A4182F3A8D4D00CCD7F8 /* BundleSPMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2144A4172F3A8D4D00CCD7F8 /* BundleSPMExtension.swift */; };
247249
2144A41B2F3A8F2500CCD7F8 /* AdyenUIAssetsAccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2144A4192F3A8F2500CCD7F8 /* AdyenUIAssetsAccessTests.swift */; };
@@ -442,6 +444,7 @@
442444
81FC2C8F2BB18F0F007F1316 /* ImageLoaderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC2C8C2BB18D0A007F1316 /* ImageLoaderMock.swift */; };
443445
81FC2C982BB1BB68007F1316 /* URLProtocolMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC2C962BB1B9F3007F1316 /* URLProtocolMock.swift */; };
444446
81FC2C992BB1BB69007F1316 /* URLProtocolMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC2C962BB1B9F3007F1316 /* URLProtocolMock.swift */; };
447+
867E3058D1CC3D00964901B6 /* DemoAPIClientMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F1B74F41FC86BF6808193FD /* DemoAPIClientMock.swift */; };
445448
A001297C2C0DF2E0009EF80C /* StoredPaymentMethodsDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A001297B2C0DF2E0009EF80C /* StoredPaymentMethodsDelegate.swift */; };
446449
A001676A2BC9567B0099A6AE /* AnalyticsValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00167692BC9567B0099A6AE /* AnalyticsValidationError.swift */; };
447450
A001676C2BD120400099A6AE /* CardHolderNameValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A001676B2BD120400099A6AE /* CardHolderNameValidator.swift */; };
@@ -739,8 +742,6 @@
739742
B6D808452BCD2B0600F3F5EB /* RSAOAEP256AlgorithmTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9F1A99326CD39740005CB1D /* RSAOAEP256AlgorithmTests.swift */; };
740743
B6EE0F382BBE9C4500B9810D /* APIClientHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E73C560525EE8C8D00B57758 /* APIClientHelper.swift */; };
741744
B6EE0F392BBE9C4500B9810D /* APIClientHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E73C560525EE8C8D00B57758 /* APIClientHelper.swift */; };
742-
B6EE0F3A2BBEA2A800B9810D /* APIClientMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E757F02525D2ED4C007C813D /* APIClientMock.swift */; };
743-
867E3058D1CC3D00964901B6 /* DemoAPIClientMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F1B74F41FC86BF6808193FD /* DemoAPIClientMock.swift */; };
744745
B6EE0F3B2BBEA2A800B9810D /* APIClientMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E757F02525D2ED4C007C813D /* APIClientMock.swift */; };
745746
B6EE0F3C2BBEAB4900B9810D /* AnalyticsProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C0005B280468E100CE2EEC /* AnalyticsProviderMock.swift */; };
746747
B6EE0F3D2BBEBF5100B9810D /* AnalyticsProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C0005B280468E100CE2EEC /* AnalyticsProviderMock.swift */; };
@@ -1956,9 +1957,11 @@
19561957
00FFD8EF2A865BFB008D4A5A /* ApplePaySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePaySettingsView.swift; sourceTree = "<group>"; };
19571958
0172FC60FB362E959E0E8A57 /* PerformAsyncTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PerformAsyncTests.swift; sourceTree = "<group>"; };
19581959
15EA5EE423D460DD2E5D65A1 /* ACHDirectDebitComponentConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ACHDirectDebitComponentConfiguration.swift; sourceTree = "<group>"; };
1959-
210920722F362C4F0014DD55 /* CardImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardImageView.swift; sourceTree = "<group>"; };
19601960
210920752F362D0F0014DD55 /* PreselectedPaymentMethodIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreselectedPaymentMethodIntegrationTests.swift; sourceTree = "<group>"; };
19611961
21099B0C2CB7276E0096502C /* PaymentInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentInfo.swift; sourceTree = "<group>"; };
1962+
211BBD652F6C4F6700EF2172 /* CardImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardImageView.swift; sourceTree = "<group>"; };
1963+
211BBD702F6C4FDD00EF2172 /* StoredCardInputViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredCardInputViewModelTests.swift; sourceTree = "<group>"; };
1964+
211BBD722F6C904800EF2172 /* StoredCardInputViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredCardInputViewControllerTests.swift; sourceTree = "<group>"; };
19621965
2144A4152F3A8D1400CCD7F8 /* AdyenUIImages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdyenUIImages.swift; sourceTree = "<group>"; };
19631966
2144A4172F3A8D4D00CCD7F8 /* BundleSPMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleSPMExtension.swift; sourceTree = "<group>"; };
19641967
2144A4192F3A8F2500CCD7F8 /* AdyenUIAssetsAccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdyenUIAssetsAccessTests.swift; sourceTree = "<group>"; };
@@ -2027,6 +2030,7 @@
20272030
5AD755DA268E11DA0040B919 /* VoucherComponentExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoucherComponentExtensions.swift; sourceTree = "<group>"; };
20282031
5AF730E92667C3F10091C573 /* APIContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIContextTests.swift; sourceTree = "<group>"; };
20292032
5AF8CD4C26691D3A00102339 /* Dummy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dummy.swift; sourceTree = "<group>"; };
2033+
6F1B74F41FC86BF6808193FD /* DemoAPIClientMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAPIClientMock.swift; sourceTree = "<group>"; };
20302034
8100F2BC2A4C3407008C09E7 /* FormValidatableItemViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormValidatableItemViewTests.swift; sourceTree = "<group>"; };
20312035
8100F2BF2A4C37E3008C09E7 /* FormSelectableItemViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormSelectableItemViewTests.swift; sourceTree = "<group>"; };
20322036
8107F4832BB1CE8A007745FC /* String+UIImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+UIImage.swift"; sourceTree = "<group>"; };
@@ -2582,7 +2586,6 @@
25822586
E7388D9523E08BF9008E62B8 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = "<group>"; };
25832587
E73C54E325EBD2DC00B57758 /* BrowserComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrowserComponent.swift; sourceTree = "<group>"; };
25842588
E73C560525EE8C8D00B57758 /* APIClientHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClientHelper.swift; sourceTree = "<group>"; };
2585-
6F1B74F41FC86BF6808193FD /* DemoAPIClientMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAPIClientMock.swift; sourceTree = "<group>"; };
25862589
E73C567E25EFCC4200B57758 /* IssuerListComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IssuerListComponentTests.swift; sourceTree = "<group>"; };
25872590
E745175425FB6A59000BDCCF /* CardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardViewController.swift; sourceTree = "<group>"; };
25882591
E745179825FB8340000BDCCF /* Card.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Card.swift; sourceTree = "<group>"; };
@@ -3041,6 +3044,11 @@
30413044
F9FE39E22679E09200F02A9B /* LoadingViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingViewTests.swift; sourceTree = "<group>"; };
30423045
/* End PBXFileReference section */
30433046

3047+
/* Begin PBXFileSystemSynchronizedRootGroup section */
3048+
211BBD692F6C4F7C00EF2172 /* UI */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = UI; sourceTree = "<group>"; };
3049+
211BBD6D2F6C4F9A00EF2172 /* StoredCardInputView */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = StoredCardInputView; sourceTree = "<group>"; };
3050+
/* End PBXFileSystemSynchronizedRootGroup section */
3051+
30443052
/* Begin PBXFrameworksBuildPhase section */
30453053
003BDD162E15200A009177E0 /* Frameworks */ = {
30463054
isa = PBXFrameworksBuildPhase;
@@ -3345,6 +3353,7 @@
33453353
0019C4132E5F2B2F00B0C3A3 /* AdyenUI */ = {
33463354
isa = PBXGroup;
33473355
children = (
3356+
211BBD692F6C4F7C00EF2172 /* UI */,
33483357
2144A41A2F3A8F2500CCD7F8 /* Assets */,
33493358
B62F517C2E97A47000610EFD /* Form */,
33503359
00731C9D2E85899D0019BA29 /* Helpers */,
@@ -3607,14 +3616,6 @@
36073616
path = Atome;
36083617
sourceTree = "<group>";
36093618
};
3610-
210920732F362C4F0014DD55 /* Views */ = {
3611-
isa = PBXGroup;
3612-
children = (
3613-
210920722F362C4F0014DD55 /* CardImageView.swift */,
3614-
);
3615-
path = Views;
3616-
sourceTree = "<group>";
3617-
};
36183619
210920762F362D0F0014DD55 /* PreselectedPaymentMethod */ = {
36193620
isa = PBXGroup;
36203621
children = (
@@ -4753,7 +4754,6 @@
47534754
C9C22D962DE5F9920028C23F /* PreselectedPaymentMethod */ = {
47544755
isa = PBXGroup;
47554756
children = (
4756-
210920732F362C4F0014DD55 /* Views */,
47574757
C9025A4C2DF31E4700E0D191 /* PreselectedPaymentMethodAssembler.swift */,
47584758
C941A51B2DF9C0B40014AFF1 /* PreselectedPaymentMethodRouter.swift */,
47594759
C9025A4A2DF3188700E0D191 /* PreselectedPaymentMethodViewController.swift */,
@@ -5329,6 +5329,7 @@
53295329
E2C0E0BF220D7E53008616F6 /* Views */ = {
53305330
isa = PBXGroup;
53315331
children = (
5332+
211BBD652F6C4F6700EF2172 /* CardImageView.swift */,
53325333
81B001C12A55C5C10015BFA3 /* UISearchBar+Prominent.swift */,
53335334
81BBB6732A82792100C1A04B /* UIView+Accessibility.swift */,
53345335
E2C0E0C0220D7E5E008616F6 /* FormButton.swift */,
@@ -6014,6 +6015,8 @@
60146015
E9E3DAC7221EDDAF00697074 /* CardNumbers.swift */,
60156016
B6C9DA7A2D102C91005D65C7 /* DualBrandAccessoryViewTests.swift */,
60166017
F9D57534238291A1009C18B5 /* BCMCComponentTests.swift */,
6018+
211BBD722F6C904800EF2172 /* StoredCardInputViewControllerTests.swift */,
6019+
211BBD702F6C4FDD00EF2172 /* StoredCardInputViewModelTests.swift */,
60176020
F9EDB78C2395643A00CFB3C9 /* CardComponentTests.swift */,
60186021
21E641B62F3F65910087253F /* PublicKeyFetcherTests.swift */,
60196022
A0B4B9B02BC027DE00C99926 /* CardComponentEventTests.swift */,
@@ -6274,6 +6277,7 @@
62746277
F919DF9C24EA7B7F0027976E /* Stored Card */ = {
62756278
isa = PBXGroup;
62766279
children = (
6280+
211BBD6D2F6C4F9A00EF2172 /* StoredCardInputView */,
62776281
F919DF9624E6E2810027976E /* StoredCardComponent.swift */,
62786282
E9240D6B2265EFE900FB57D0 /* StoredCardAlertManager.swift */,
62796283
E7451A102600EDE0000BDCCF /* StoredCardConfiguration.swift */,
@@ -7313,6 +7317,9 @@
73137317
819BFB4D2BDBEECA0018DC9B /* PBXTargetDependency */,
73147318
A069FDF82DDDC9B700A214B8 /* PBXTargetDependency */,
73157319
);
7320+
fileSystemSynchronizedGroups = (
7321+
211BBD692F6C4F7C00EF2172 /* UI */,
7322+
);
73167323
name = UnitTests;
73177324
productName = AdyenUnitTests;
73187325
productReference = B62D48AC2BBE8D79001EF01A /* UnitTests.xctest */;
@@ -7418,6 +7425,9 @@
74187425
F91761C125A30E1B00D653BE /* PBXTargetDependency */,
74197426
F92326F525A3672A002C5BC4 /* PBXTargetDependency */,
74207427
);
7428+
fileSystemSynchronizedGroups = (
7429+
211BBD6D2F6C4F9A00EF2172 /* StoredCardInputView */,
7430+
);
74217431
name = AdyenCard;
74227432
productName = AdyenCard;
74237433
productReference = E2C0E05F220982AE008616F6 /* AdyenCard.framework */;
@@ -8263,6 +8273,7 @@
82638273
0019C4512E6ADF9D00B0C3A3 /* FormItemViewBuilder.swift in Sources */,
82648274
0019C4522E6ADF9D00B0C3A3 /* FormView.swift in Sources */,
82658275
0019C48F2E6AE08E00B0C3A3 /* FormSearchButtonItem.swift in Sources */,
8276+
211BBD662F6C4F6700EF2172 /* CardImageView.swift in Sources */,
82668277
0019C4C72E6B166800B0C3A3 /* UIProgressViewHelpers.swift in Sources */,
82678278
0019C4902E6AE08E00B0C3A3 /* FormSearchButtonItemView.swift in Sources */,
82688279
0019C4532E6ADF9D00B0C3A3 /* FormViewController+ViewProtocol.swift in Sources */,
@@ -8752,6 +8763,7 @@
87528763
E9E3DAB2221D79C800697074 /* CardNumberFormatterTests.swift in Sources */,
87538764
F9EDB796239663F800CFB3C9 /* PaymentComponentMock.swift in Sources */,
87548765
F9B9F625295485A2008C2E49 /* ThreeDSResultExtension.swift in Sources */,
8766+
211BBD732F6C905100EF2172 /* StoredCardInputViewControllerTests.swift in Sources */,
87558767
E7D189B025D31936006AD3B7 /* DropInActionTests.swift in Sources */,
87568768
B65F0EB42ED493250015AC41 /* FormButtonItemViewThemeTests.swift in Sources */,
87578769
C95903DE275A48D000E7D3BC /* BACSDirectDebitComponentTests.swift in Sources */,
@@ -8888,6 +8900,7 @@
88888900
C981254E2851E9AF006D1374 /* PaymentComponentSubject.swift in Sources */,
88898901
81A48DC62A5800EA00242341 /* AddressLookupViewControllerTests.swift in Sources */,
88908902
21B387B62C401C890029101E /* ThreeDS2DAScreenPresenterMock.swift in Sources */,
8903+
211BBD712F6C4FDD00EF2172 /* StoredCardInputViewModelTests.swift in Sources */,
88918904
C92245B52EE988F200815A51 /* ApplePayNetworksProvidingMock.swift in Sources */,
88928905
F9D5750E237475DB009C18B5 /* CardEncryptorCardTests.swift in Sources */,
88938906
F9C5F0DD25CAB8FC005A6E54 /* VoucherComponentTests.swift in Sources */,
@@ -9096,7 +9109,6 @@
90969109
C941A5202DF9C2C10014AFF1 /* PaymentMethodListAssembler.swift in Sources */,
90979110
C9C22D932DE5F9620028C23F /* ComponentContainerViewModel.swift in Sources */,
90989111
E7DE050627F7243000CB5F83 /* NavigationDelegate.swift in Sources */,
9099-
210920742F362C4F0014DD55 /* CardImageView.swift in Sources */,
91009112
C941A5242DF9CB350014AFF1 /* ComponentContainerViewController.swift in Sources */,
91019113
E9B36CC522451C7100EAA368 /* ComponentManager.swift in Sources */,
91029114
C941A51E2DF9C21F0014AFF1 /* PaymentMethodListRouter.swift in Sources */,

Adyen/Assets/Generated/LocalizationKey.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ public struct LocalizationKey {
7676
public static let cardCvcItemInvalid = LocalizationKey(key: "adyen.card.cvcItem.invalid")
7777
/// Security code
7878
public static let cardCvcItemTitle = LocalizationKey(key: "adyen.card.cvcItem.title")
79+
/// Enter security code
80+
public static let cardSecurityCodeTitle = LocalizationKey(key: "adyen.card.securityCode.title")
81+
/// Enter the security code for %@ to complete the payment of %@
82+
public static let cardSecurityCodeDescription = LocalizationKey(key: "adyen.card.securityCode.description")
7983
/// 123
8084
public static let cardCvcItemPlaceholder = LocalizationKey(key: "adyen.card.cvcItem.placeholder")
8185
/// Verify your card

Adyen/Assets/en-US.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"adyen.card.cvcItem.invalid" = "Invalid CVC / CVV format";
3434
"adyen.card.cvcItem.title" = "Security code";
3535
"adyen.card.cvcItem.placeholder" = "123";
36+
"adyen.card.securityCode.description" = "Enter the security code for %@ to complete the payment of %@";
3637
"adyen.card.stored.title" = "Verify your card";
3738
"adyen.card.stored.message" = "Please enter the CVC code for %@";
3839
"adyen.card.stored.expires" = "Expires %@";

Adyen/Utilities/Completion.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ import Foundation
88

99
/// Alias for a completion handler with a single parameter of type T.
1010
public typealias Completion<T> = (T) -> Void
11+
12+
/// Alias for a completion handler with no parameters.
13+
/// Note i cannot use the Completion<T> type as Completion<Void> as that would make the call site become completion(Void) or completion(())
14+
public typealias VoidCompletion = () -> Void

0 commit comments

Comments
 (0)