2016-11-11 3 views
-1

В настоящее время я делаю приложение IOS с использованием Stripe. Когда я попытался реализовать объект нашивки карты (изображение ниже), я получил ошибку компилятора на линииЗначение необязательного типа [String] не завернуто

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 

Как исправить эту ошибку? Ваша помощь будет оценена!

+1

Что такое expArr в вашем коде? – User511

+0

expArr = массив даты истечения срока годности. Я хочу, чтобы пользователи вводили формат «MM/YYYY» –

ответ

-1

Ваш expArr является необязательным, я подозреваю, попробуйте разворачивать его первым:

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

Кроме того, я даже не уверен, что вы можете напрямую присвоить Int к NSNumber, как NSNumber является тип указателя, но это может измениться в Swift 3.

+0

привет Jacos. Спасибо, что ответили! Когда я развернулся, как вы закодированы, я получил еще одну ошибку: «Тип выражения неоднозначен без дополнительного контекста». –

+0

Да, поскольку я ожидал, что вы не можете напрямую назначить int NSNumber, см. Бросок в моем исправленном ответе. –

+0

привет jacob. Огромное спасибо. Я применяю ваш метод сейчас! –

-1

Преобразование из междунар в NSNumber:

NSNumber(value: intValue) 
+0

привет Бхавук. Я очень ценю вашу помощь! вы были правы на этом. var expMonth: NSNumber = NSNumber (значение: Int (expArr! [0])!) var expYear: NSNumber = NSNumber (значение: Int (expArr! [1])!) ошибка исчезла –

-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 

    // ... 
}