2017-01-18 2 views
-1

следующие работы в Playground:Проблема преобразования строки в Int

func stringToInt(numberStr: String!) -> Int { 
    print(numberStr) 
    return Int(numberStr)! 
} 

let strNum1: String? 
strNum1 = "1" 

let result = stringToInt(numberStr: strNum1) 

Она возвращает 1, как и ожидалось.

В Xcode, подобный подход не:

func stringToInt(numberStr: String!) -> Int { 

    print("\(numberStr!)") 
    let str = "\(numberStr!)" 
    print(Int(str)) 

    return Int(str)! 
} 

Первая печать производит: Дополнительно (1) Вторая печать производит: ноль Ответный утверждение терпит неудачу, потому что он пытается создать Int из ноль.

Это должно быть что-то простое, но я не смог определить, почему он не работает. Это в Swift 3 и Xcode 8 BTW.

@Hamish:

В Xcode, у меня есть строка с числовым значением. Это:

печать ("номер: (selectedAlertNumber) - единица измерение: (selectedAlertUnit)")

... производит это:

номер: факультативная (1) - единица: День

Затем я проверяю, чтобы увидеть, если либо selectedAlertNumber из selecterAlertUnit =! «-»

    if selectedAlertNumber != "-" && selectedAlertUnit != "-" { 
         // set alert text 
         var unitStr = selectedAlertUnit 
         let alertNumber = stringToInt(numberStr: selectedAlertNumber) 
         if alertNumber > 1 { 
          unitStr.append("s") 
         } 
         let alertText = "...\(selectedAlertNumber) \(unitStr) before event." 
         alertTimeCell.setAlertText(alertText: alertText) 


         // set alert date/time 
        } 

Выпускаемое alertNumber = stringToInt ... линия как я звоню функцию. Я мог бы просто попытаться преобразовать туда, но я хотел бы изолировать проблему, обернув преобразование в свою собственную функцию.

+0

Не удалось добавить, преобразование Int (numberStr) на фрагменте Xcode (например, на игровой площадке); Я пробовал другой подход, когда я разместил этот пример. – PixelStack

+0

Я не могу воспроизвести это - как вы называете 'stringToInt'? [Mcve] был бы наиболее полезен. Как побочная заметка, вы не должны аннотировать «numberStr» как IUO - это было бы намного безопаснее как необязательный параметр. – Hamish

+0

@Hamish: обновлено мое оригинальное сообщение, чтобы показать, как я вызываю функцию. – PixelStack

ответ

1

Использование струнной интерполяции для преобразования значений в строку обычно не рекомендуется, так как выход может отличаться в зависимости от факультативного состояния значения. Например, рассмотрим эти две функции:

func stringToInt(numberStr: String!) -> Int 
{ 
    print("\(numberStr!)") 
    let str = "\(numberStr!)" 
    return Int(str)! 
} 

func otherStringToInt(numberStr: String!) -> Int 
{ 
    print(numberStr) 
    let str = "\(numberStr)" 
    return Int(str)! 
} 

Единственное различие между этими двумя во втором вызывается функция ! при использовании строки интерполяции, чтобы получить значение String типа из numberStr. Чтобы быть более конкретным, в одной и той же линии в функции 1 по сравнению с функцией 2, строковые значения сильно отличаются в зависимости от того, является ли дополнительный интерполированное значение:

let str1: String = "1" 
let str2: String! = "1" 
let str3: String? = "1" 

let otherStr1 = "\(str1)" // value: "1" 
let otherStr2 = "\(str2)" // value: "Optional(1)" 
let otherStr3 = "\(str2!)" // value: "1" 
let otherStr4 = "\(str3)" // value: "Optional(1)" 
let otherStr5 = "\(str3!)" // value: "1" 

Передача otherStr2 или otherStr4 в Int инициализатора будет производят ноль, так как строка "Optional(1)" не конвертируется в Int. Кроме того, это приведет к ошибке во время разворота силы. Вместо использования строковой интерполяции в вашей функции было бы лучше просто использовать значение напрямую, так как оно уже является String.

func stringToInt(numberStr: String!) -> Int 
{ 
    return Int(numberStr)! 
} 

Дайте мне знать, если это имеет смысл.

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

+0

Спасибо, Майкл; да, это имеет смысл. – PixelStack

Смежные вопросы