Как остановить преобразование кода в необязательный код - PullRequest
0 голосов
/ 08 сентября 2018

, поэтому я использую этот платежный шлюз под названием «moip» (им из Бразилии, здесь не работает нашивка), который берет информацию о кредитной карте пользователя и создает хэш (из-за передачи конфиденциальных данных и т. Д.). Но по какой-то причине этому коду нужна строка типа 2 длины для месяца и года, и когда я передаю эти значения, они становятся необязательными, поэтому основная функция (которая создает хэш) не работает и возвращает nil. Пример кода:

func createHash() -> String? {            
    let creditCard = MPKCreditCard()
    creditCard.number = "1234567891234567"
    creditCard.expirationMonth = "01"
    creditCard.expirationYear = "19"
    creditCard.cvc = "123"
    return MoipSDK.encryptCreditCard(creditCard)
}

Это объект MPKCreditCard в объекте:

#import <Foundation/Foundation.h>
#import "MPKCardType.h"

@interface MPKCreditCard : NSObject

@property NSString *number;
@property NSString *cvc;
@property NSString *expirationMonth;
@property NSString *expirationYear;

- (BOOL) isNumberValid;
- (BOOL) isSecurityCodeValid;
- (BOOL) isExpiryDateValid;
- (MPKCardType) cardType;

@end

Свойство «isEspiryDateValid», конечно, всегда возвращает false, остальные - в порядке.

- (BOOL) isExpiryDateValid {
    return [self isValidLengthExpiryDate] && [self isValidDate];
}

- (BOOL)isValidLengthExpiryDate {
    return self.expirationMonth.length == 2 && (self.expirationYear.length == 2 || self.expirationYear.length == 4);
}

- (BOOL)isValidDate {
    if (self.expirationMonth <= 0 || [self month] > 12) return NO;

    return [self isValidWithDate:[NSDate date]];
}

И это функция, которая создает хеш:

+ (NSString *)encryptCreditCard:(MPKCreditCard*)creditCard {

    NSString *valueToEncrypt = [NSString stringWithFormat:@"number=%@&cvc=%@&expirationMonth=%@&expirationYear=%@", creditCard.number, creditCard.cvc, creditCard.expirationMonth, creditCard.expirationYear];
    NSLog(@"%@", valueToEncrypt);
    NSString *encriptedData = [MPKUtilities encryptData:valueToEncrypt keyTag:kPublicKeyName];

    if (encriptedData) {
        return encriptedData;
    }

    return nil;
}

Я не очень разбираюсь в objc, но свойство не выглядит отличным от других (это превратит значение в необязательное).

Я знаю, что компания платежного шлюза должна предоставить мне решение, и я верю, что они это сделают, но сегодня (07 сентября) день независимости, и ничего не работает. Так что я мог бы использовать вашу помощь в понедельник :(

Короче говоря, моя проблема заключается в следующем: я передаю развернутые необязательные значения в expirationMonth и expirationYear. Но когда объект (mpkcreditcard) получает их, он превращает их в необязательные.

Большое спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Обязательно пометьте свойства как ненулевое , если вы хотите передать их в Swift.

@property (nonatomic, nonnull) NSString *number;
@property (nonatomic, nonnull) NSString *cvc;
@property (nonatomic, nonnull) NSString *expirationMonth;
@property (nonatomic, nonnull) NSString *expirationYear;

Маркировка типов как nonnull импортирует их как необязательные в Swift.

0 голосов
/ 08 сентября 2018

Я не совсем понимаю вопрос в его нынешнем виде, но я верю в то, что вы сталкиваетесь с тем, что все эти значения в obj-c обнуляются, поэтому при переходе обратно к быстрому они становятся необязательными. Вам просто нужно будет развернуть их, чтобы использовать их ...

guard let experationMonth = creditcard.experationYear else { /* handle null */ }
print("\(experationMonth)")

Это должно напечатать развернутую строку без необязательного [""]

...