2015-07-06 2 views
2

Мой вопрос прост,Как конвертировать NSArray в [Int] с Swift

let string = "1,2,3,4,5,6" 

Как я хочу, чтобы найти значение максимального в строке, и я хочу использовать метод в this way, так что мне нужно сделать это:

let array = string.componentsSeparatedByString(",") as [AnyObject] 
let numArray = array as! [Int] 
let maxNum = numArray.reduce(Int.min, combine: {max($0,$1)}) 

Но, будет ошибка в "! массив как [Int]"

fatal error: array cannot be bridged from Objective-C 

И если это

let numArray = array as! [String] 

Это будет хорошо, но мы не можем использовать уменьшить метод.

Итак, как преобразовать массив со строкой в ​​[Int]?

ответ

2

Вы можете использовать reduce и опционные, предотвращая использование принудительной разворачивания, что может привести к сбою приложения, если строка фактически не содержит чисел.

Вот код:

let array = string.componentsSeparatedByString(",") 

let initial: Int? = .None 
let max = array.reduce(initial) { 
    let num = $1.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).toInt() 

    return num > $0 ? num : $0 
} 

Первая линия разбивает строку на массив строк - обратите внимание, что нет никакой необходимости в гипсе, так как метод уже возвращает массив строк.

Метод reduce используется путем передачи необязательного целого числа в качестве начального значения, установленного в .None (что является синонимом для nil).

Закрытие, переданное в reduce, преобразует текущее значение в целое число с использованием toInt(), которое возвращает необязательный параметр для учета строки, не конвертируемой в действительное целое число.

Затем замыкание возвращает преобразованное число, если оно больше, чем значение, вычисленное на предыдущей итерации (или исходное значение), иначе оно возвращает значение на последней итерации.

Обратите внимание, что сравнение целых чисел и nil совершенно допустимо: любое целое значение равно всегда больше nil (даже отрицательное значение).

Этот метод работает с «нормальным» списком номеров:

let string = "1, 2, 3, 4, 5, 6, 7" // The result is 7 

, но и списки, имеющие номера и не-числа:

let string = "1, 2, three, 4, 5, 6, seven" // the result is 6 

и списки, не содержащие номера:

let string = "one, two, three, three, four, five, six, seven" // the result is nil 
+0

Опционы неявно инициализируются на 'nil',' = .None' не требуется. –

+0

Я меняю 'let initial: Int? = .None' для 'let initial: int! = .None' Потому что мне нужно получить строку, поэтому 'return" \ (max) "' будет иметь некоторую 'необязательную строку', но' int! 'Будет в порядке. В любом случае, спасибо за ваш ответ! – KaKa

+0

@KaKa: Сделать это неявно разворачиваемым необязательно означает, что вы получите результат, отличный от нуля. Если бы я был в вас, я бы ограничил их использование в действительно необходимых случаях, предпочитая обычные опции во всех остальных случаях. – Antonio

2

можно сопоставить массив

let string = "1,2,3,4,5,6" 
let numArray = string.componentsSeparatedByString(",").map {$0.toInt()!} 
+0

Получил ошибку "AnyObject не имеет член с именем toInt()" – KaKa

+0

Если вы знаете, что это 'AnyObject' является строкой, брось в строку с 'как! String' – vadian

1
let string = "1,2,3,4,5,6" 

func toInt(str: String) -> Int { 
    return str.toInt()! 
} 

let numArray = map(string.componentsSeparatedByString(",") as [String], toInt) 

Затем numArray является [1, 2, 3, 4, 5, 6].

0

Swift 2.0,

let string = "1,2,3,4,5,6" 
let numArray = string.componentsSeparatedByString(",").map{ Int($0)! } 
0

В Swift 4.0:

let string = "1,2,3,4,5,6" 
let stringArray = string.split(separator: ",").map(String.init) 
let intArray = stringArray.flatMap(Int.init) 
intArray.max() 
Смежные вопросы