可选类型[String]的值未包装

时间:2016-11-11 08:26:19

标签: ios swift stripe-payments

我目前正在使用Stripe制作IOS应用。当我尝试实现Stripe卡对象(下图)时,我在行上遇到了编译器错误

var expMonth: NSNumber = Int(expArr[0])!
var expYear: NSNumber = Int(expArr[1])!

说 “可选类型[String]的类型未包装。未解包;你的意思是使用!还是??”

func buttonPressed(_: UIButton) {

    let creditCard = STPCardParams()
    creditCard.number = cardNumberTextField.text
    creditCard.cvc = cvvTextField.text

    if (expDateTextField.text?.isEmpty == nil){

        let expArr = expDateTextField.text?.components(separatedBy: "/")
        if (expArr?.count)! > 1 {

            var expMonth: NSNumber = Int(expArr[0])!
            var expYear: NSNumber = Int(expArr[1])!

            creditCard.expMonth = expMonth.uintValue
            creditCard.expYear = expYear.uintValue

如何修复此错误?非常感谢您的帮助!

3 个答案:

答案 0 :(得分:-1)

我怀疑你的expArr是可选的,请先尝试展开它:

var expMonth: NSNumber = NSNumber(value: Int(expArr![0])!)
var expYear: NSNumber = NSNumber(value: Int(expArr![1])!)

另外我甚至不确定你可以直接为NSNumber分配一个int,因为NSNumber是一个指针类型,但在Swift 3中可能已经改变了。

答案 1 :(得分:-1)

从int转换为NSNumber:

NSNumber(value: intValue)

答案 2 :(得分:-1)

expArr类型为[String]?。您可以通过强制单击变量名来检查这一点。

由于它是可选的,你必须解开它,然后才能访问数组中的项目:

var expMonth: NSNumber = Int(expArr[0])!
var expYear: NSNumber = Int(expArr[1])!

你可以通过强行展开它来做到这一点:

var expMonth: NSNumber = Int(expArr![0])!
var expYear: NSNumber = Int(expArr![1])!

或者你可以通过条件绑定来实现,这更安全:

if let expirationDates = expArr {
    var expMonth: NSNumber = Int(expirationDates[0])!
    var expYear: NSNumber = Int(expirationDates[1])!

    creditCard.expMonth = expirationDates.uintValue
    creditCard.expYear = expirationDates.uintValue

    // ...
}