Префикс массива (while :) повторяется разное количество раз для одного и того же лога c. (не в состоянии понять) - PullRequest
1 голос
/ 09 марта 2020

Вот снимок игровой площадки, где я пытаюсь напечатать все четные числа, пока вы не доберетесь до нечетного 3-мя способами, и я не понимаю, почему существует разное количество циклов

enter image description here

Насколько я понимаю, это должно быть l oop только 7 раз, потому что в начальном 6 чисел, а в 7-й - нечетное число, которое должно заканчиваться символом l. oop но мы получили 8 раз в одном случае! Почему?

Также буквально второй и третий способы одинаковы, но все же есть разница в количестве выполнений l oop.

Это, я не понимаю.

===== РЕДАКТИРОВАТЬ =======
Меня попросили ввести текстовую форму код так вот это

import UIKit

// First way
var arr = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix { num in
    return num.isMultiple(of: 2)
}
print(arr)

// Second way
var arr2 = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix(while: {$0.isMultiple(of: 2)})
print(arr2)

//Third way (almost second way but directly prinitng this time)
print([34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30]
    .prefix(while: {$0.isMultiple(of: 2)}))

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Сообщение "(x times)" на самом деле не говорит о том, сколько раз строка выполняется в oop.

Думайте об этом так, иногда игровая площадка хочет выводить несколько сообщений на той же строке, потому что две вещи оцениваются в этой строке. Это чаще всего случается в циклах, где в каждой итерации оценивается новая вещь, и XCode хочет отобразить это в той же строке, но не может, поэтому может отображать только «(2 раза)».

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

let x = Optional.some(1).map { $0 + 1 }.map { String($0) } // (3 times)

Здесь оцениваются 3 вещи:

  • x
  • $0 + 1
  • String($0)

Другой пример:

func f() { print("x");print("y") } // (2 times)
f() 

Обычно каждый оператор print будет иметь несколько текст отображается справа, не так ли? Но так как они находятся в одной строке, Xcode может показывать только «(2 раза)».

В этом случае происходит то же самое:

var arr2 = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30].prefix(while: {$0.isMultiple(of: 2)})

Необходимо оценить 8 вещей. Результат закрытия оценивается 7 раз, плюс один раз для значения arr2.

Если вы поместите объявление переменной и замыкание в отдельные строки, то Xcode может показать значение переменная в отдельной строке, поэтому в двух других случаях число на единицу меньше.

Чтобы проиллюстрировать это графически:

enter image description here

Вы заставляете Xcode объединить два коробочных сообщения в одну строку. XCode не может втиснуть весь этот текст в одну строку, поэтому лучшее, что он может сделать, это "(8 раз)".

1 голос
/ 09 марта 2020

Я считаю, что это всего лишь артефакты работы детских площадок. С небольшим переформатированием я получаю «7 раз» во всех трех вариантах:

let data = [34, 92, 84, 78, 90, 42, 5, 89, 64, 32, 30]
let arr = data.prefix {
    $0.isMultiple(of: 2)
}
print(arr)

let arr2 = data.prefix(while: {
    $0.isMultiple(of: 2)
})
print(arr2)

print(data.prefix(while: {
    $0.isMultiple(of: 2)
}))

...