Как преобразовать NSString в целое число с помощью Swift?

Мне нужно преобразовать NSString в целое число в Swift: вот текущий код, который я использую; он не работает:

 var variable = (NSString(data:data, encoding:NSUTF8StringEncoding))
 exampeStruct.otherVariable = (variable).intValue

Переменная - это нормальная переменная, а exampleStruct - это структура в другом месте кода с подвариантной переменной otherVariable.

Я ожидаю, что он установит exampleStruct.otherVariable в значение int для NSString, но я получаю следующую ошибку:

"Cannot convert the expression type () to type Float"

Как преобразовать NSString в int в Swift?

Ответ 1

Вам нужно развернуть 2 варианта, обратите внимание, что я также объявил переменную как String, добавив там: "String". Пример:

if let variable:String = NSString(CString:"1", encoding: NSUTF8StringEncoding) {
    if let otherVariable = variable.toInt() {
        println(otherVariable) // "1"
    }
} 

В вашем случае вы должны сделать следующее:

if let variable:String = NSString(data: data, encoding: NSUTF8StringEncoding) {
    if let exampeStruct.otherVariable = variable.toInt() {
        println(exampeStruct.otherVariable) // "1"
    }
}

Ответ 2

Мне кажется, что проблема может быть не в преобразовании Int, а в том, что exampleStruct ожидает Float.

Если это не проблема (и предоставлено, ошибки Xcode для Swift часто, похоже, больше связаны с номером строки, а не с фактической проблемой), то что-то вроде этого должно работать на вас?

var ns:NSString = "1234"
if let i = (ns as String).toInt() {
    exampleStruct.otherVariable = i
}

Ответ 3

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

Сначала у нас есть NSData, который мы хотим преобразовать в NSString, потому что никто не гарантирует, что данные являются допустимым буфером UTF8, он возвращает необязательный

 var variable = NSString(data:data, encoding:NSUTF8StringEncoding)

Что означает variable: NSString?

Обычно NSString подключается к swift String, но в этом случае мы используем конструктор NSString - вы можете думать об этом скорее как синтаксис типа "Foundation", который не был напрямую импортирован в swift (так как нет моста для NSData)

мы все еще можем использовать способ "Foundation" с NSString

if let unwrappedVariable = variable {
    var number = unwrappedVariable.intValue
}

если number является Float, но строка представляет собой строковое представление целого числа

if let unwrappedVariable = variable {
    var number: Float = Float(unwrappedVariable.intValue)
}

если оба number и строка (представление) являются float:

if let unwrappedVariable = variable {
    var number:Float = unwrappedVariable.floatValue
}

Во всяком случае, существует небольшая проблема с использованием Foundation. Для этих типов преобразований нет понятия необязательного значения (для int, float). Он будет возвращать 0, если он не может разобрать строку как целое число, так и float. Для этого лучше использовать быстрый родной String:

if let variable: String = NSString(data: data, encoding: NSUTF8StringEncoding) {
    if let integer = variable.toInt() {
        var integerNumber = integer
        var floatNumber = Float(integer)
    }
}