Свифт, может ли литерал массива, содержащий целые числа, использоваться взаимозаменяемо с массивом целых чисел? - PullRequest
0 голосов
/ 19 февраля 2019

В моем примере у меня есть метод, принимающий IndexSet:

func printIndexSet(_ indexSet: IndexSet) {
    indexSet.forEach {
        print($0)
    }
}

Если я попытаюсь передать ему литерал массива, содержащий целые числа, он может определить его тип и построить indexSet:

printIndexSet([1, 2]) // Compiles fine

Если я дам ему массив целых чисел, хотя он не скомпилируется

// The following fail with error:
// Cannot convert value of type '[Int]' to expected argument type 'IndexSet'
printIndexSet(Array<Int>([1,2]))
let indices: [Int] = [1, 2]
printIndexSet(indices)

что здесь происходит?

1 Ответ

0 голосов
/ 19 февраля 2019

В Swift есть важное различие между типами и литералами.

Как вы сказали, [1, 2] - это массив литерал .Не массив.Литерал массива - это в основном то, что может быть использовано для создания любого типа, который соответствует ExpressibleByArrayLiteral.

Вы можете использовать литерал массива для создания массива, но вы можете использовать его для создания других типов, таких как IndexSets.

С printIndexSet([1, 2]) вы используете литерал массива для создания IndexSet.

И printIndexSet(Array<Int>([1,2])) выдает ошибку, потому что ваша функция ожидает IndexSet в качестве аргумента, а не Array.Надеюсь, это поможет!

Обновление:

Как правильно заметил @rmaddy в комментариях под моим ответом, IndexSet соответствует SetAlgebra, что соответствует ExpressibleByArrayLiteral.Вот почему вы можете использовать литерал массива для создания IndexSet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...