如何阻止objc代码转换为可选代码

时间:2018-09-07 21:03:50

标签: ios objective-c swift payment-gateway payment-processing

因此,我正在使用名为“ moip”的付款网关(来自巴西的im,stripe在此无效),该网关获取用户的信用卡信息并进行哈希处理(由于敏感数据传输等)。但是由于某种原因,此代码在月份和年份中需要一个长度为2的类型的字符串,当我传递这些值时,它们变为可选项,因此主函数(产生哈希值)不起作用并返回nil。示例代码:

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

这是objc中的对象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的了解不多,但是该属性与其他属性看起来并没有什么不同(它将将该值转换为可选值)。

我知道支付网关公司应该为我提供解决方案,我相信他们会的。但是,今天(9月7日)是独立日,没有任何效果。因此,我可以在周一再次使用您的帮助,否则:(

简而言之,我的问题是:我将未包装的非可选值传递给expirationMonth和expirationYear。但是当对象(mpkcreditcard)接收到它们时,它将变成可选对象。

非常感谢你们!

2 个答案:

答案 0 :(得分:0)

我并没有完全理解这个问题,但是我相信您遇到的是obj-c中的所有这些值都是可以为空的,因此当桥接回swift时,它们成为可选值。您只需解开它们即可使用它们...

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

这应该打印一个没有可选的[“”]

的未包装字符串

答案 1 :(得分:0)

当您要将属性传递给Swift时,请确保将属性标记为 nonnull

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

将类型标记为 nonnull 会将其作为Swift中的非可选类型导入。