Не понятные циклы для новичков

swift3

#1

на просторах хабра тыг-дыг заметил необычайно странное высказывание:

  1. непонятный синтаксис цикла по сравнению с "for _ in _ {}"
    let mixedArray = [“4”, “5”, “a”, “-2”, “Str”]
    let results = mixedArray
    .filter({ (obj) -> Bool in return Int(obj) != nil })
    .map { (obj) -> Int in return Int(obj)! }
    .reduce(0, +)

  2. написано, что подход “на много” лучше и нужны они чтобы улучшить жизнь разработчиков.

Теперь пара вопросов:

  1. можете объяснить, что это за метод такой
  2. чем он лучше и красивее, чем for in
    З.ы. только недавно понял эти циклы и начал решать разные задачки, а тут какой то новый цикл портит мне все мои предыдущие решения:laughing:. И, да, жалко, что гугл не приняли свифт за новый язык для андроидов

#2

Учитесь искать информацию самостоятельно. Это крайне необходимый навык.


#3
let results = mixedArray
    .filter({ (obj) -> Bool in return Int(obj) != nil })
    .map { (obj) -> Int in return Int(obj)! }
    .reduce(0, +)

Я бы после такого трэша даже читать не стал :slight_smile:

Для сравнения:

let result = mixedArray.flatMap { Int($0) }.reduce(0, +)

#4

Спасибо, что ответили на мои вопросы(нет). Что ваш вариант, что хабровский я не понимаю, можете, пожалуйста, объяснить их?


#5

Как с помощью цикла можно это записать?

var sum = 0

for i in mixedArray {
  // .filter({ (obj) -> Bool in return Int(obj) != nil })
  if Int(i) != nil {
    // .map { (obj) -> Int in return Int(obj)! }
    let x = Int(i)
    // .reduce(0, +)
    sum += x!
  }
}

Больше строк кода и вложенность.

haymob указал, что условие на хабре написано излишне сложно. И предложил вам более простой вариант. С помощью цикла его можно написать так :

var sum2 = 0

for i in mixedArray {
  // flatMap { Int($0) }
  if let x = Int(i) {
    // .reduce(0, +)
    sum2 += x
  }
}

1 строка кода против 6.

Посмотрите видео, которое я вам отправил ранее.
Про замыкания можно почитать тут: http://swiftbook.ru/doc/closures