2016-01-12 4 views
1

У меня есть String массив:Swift 2.0, как преобразовать массив строк в массив целых чисел

values = [textField1.text!, textField2.text!, textField3.text!, textField4.text!, textField5.text!] 

, и я хочу, чтобы преобразовать его в Int массив. Как мне это сделать в swift 2.0?

+0

Что делать, если текстовое поле не содержит допустимого целочисленного представления? – zaph

+1

@SergiiZhevzhyk Просто примечание: принятый ответ в дубликате (я согласен, что он очень близок к дубликату) также представляет собой небезопасную версию с принудительной разворачиванием, как и исходный ответ flashspys. Лучше всего было бы, если бы связанная почта могла обновить свой ответ безопасным методом, но до тех пор я предлагаю, чтобы этот пост не был закрыт как дубликат. – dfri

+0

@dfri первый комментарий в принятом ответе уже делает это –

ответ

5

Вы можете использовать функцию Swift карты:

var intArray = values.map({Int($0) ?? 0}) 
+0

Предполагается, что все текстовые поля преобразуются в целые числа. Там действительно должна быть некоторая проверка ошибок. +1 в любом случае. – zaph

+1

это правда. 'let myIntArrSafe = myStringArr.map {Int ($ 0) ?? 0} 'из @dfri - очень хорошее решение – flashspys

+0

спасибо, что это мне помогло – 123558

2

Прежде всего, вы должны, вероятно, не инициализировать вас массив строк с форсированным unwrappings необязательных строк (что, если один из текстовых полого .text свойства является nil? Исключение Runtime). Вы можете сделать это безопасным способом, используя всухую оператор коалесцирующий:

let myStringArr = [textField1.text ?? "0", textField2.text ?? "0"] 

Теперь, то же самое преобразование типов: например, строка «foo» вернет нуль для попытка конверсия Int("foo") (не, per se, преобразование, но инициализация Int по String). Таким образом, учитывая, вы благополучно прибыли в массиве строк (как в примере коды выше), вы можете, опять же, использовать всухую оператор коалесцирующего для обеспечения безопасной инициализации из Int записей в вашем Int массиве:

let myStringArr = ["1", "foo", "4", "bar", "3.5"] 

let myIntArrSafe = myStringArr.map { Int($0) ?? 0 } 
print(myIntArrSafe) 
/* [1, 0, 4, 0, 0] */ 

Другим решением будет расширение типа String путем безопасного целочисленного преобразования, возвращающего 0 в случае Int по ошибке String.

extension String { 
    var integerValue: Int { return Int(self) ?? 0 } 
} 

let myStringArr = ["1", "foo", "4", "bar", "3.5"] 

let myIntArrSafe = myStringArr.map { $0.integerValue } 
print(myIntArrSafe) 
/* [1, 0, 4, 0, 0] */ 
+0

Вы также можете использовать 'flatMap' для принятия любых значений' nil' из массива 'Int'. –

+1

@MrBeardsley действительно; вы, тем не менее, потеряете какую-либо ссылку относительно того, какие текстовые поля создавали записи nil, а также какие значения Integer связаны с тем, какие текстовые поля (поскольку итоговый массив Int (заданный nils) усечен) – dfri

+0

@dfri, это правда, правда также что если результат равен 0, вы не знаете, почему (это может быть результат строки «foo» или «0», поэтому все зависит от ваших конкретных потребностей. Я предпочитаю [Int?] в результате Я предпочитаю Int? (Str: String) и т. Д. – user3441734

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