Заполнители типов были недавно введены в Swift 5.6. Свяжитесь с новой полезной функцией Swift.

Заполнители типов были недавно введены в Swift 5.6. И да, они являются хорошим дополнением к мощной системе логического вывода типа Swift. Если вы знакомы с C++, вы должны знать о ключевом слове auto. Типовые заполнители почти одинаковы.

Универсальные шаблоны и заполнитель типа

let number: _ = 42 // Type placeholder
let anotherNumber = 42

Да, Swift может вывести тип переменной, но заполнители типов предназначены для использования для типа с несколькими типами в нем. Дженерики. Вот где они действительно светятся.

Рассмотрим обычное перечисление Result

enum Result<Success, Failure> where Failure : Error {
    case success(Success)
    case failure(Failure)
}

А что, если у нас есть какой-то сложный объект

var ohMy = [1: [3: (1, 2, 3, "That's a long tuple")]]

Если вы попытаетесь создать Result из ohMy, вы увидите ошибку компиляции.

let result = Result.success(ohMy)

Примечание. Общий параметр Failure не может быть выведен.

Братан. Значит надо написать…

let result = Result<[Int : [Int : (Int, Int, Int, String)]], Error>.success(ohMy)

💡 Используйте заполнители типов, чтобы опустить тип, который может вывести Swift.

Благодаря заполнителям шрифтов, нет. Swift может сам определить тип объекта. Итак, нам нужно указать только тип Failure.

let result = Result<_, Error>.success(ohMy) // Nice

Коллекции и заполнитель типа

Эта функция также полезна при работе с коллекциями. Что, если нам нужен словарь с перечисляемыми ключами?

enum Foo {
	case bizz
	case bonk
}

let results = [
	.bizz: ohMy,
	.bonk: ohMy
]

Ссылка на элемент bizz не может быть разрешена без контекстного типа

Итак, давайте добавим этот контекстный тип, но помните ли вы, как плохо выглядит тип ohMy? Давайте воспользуемся заполнителем типа.

// 🚫
let results:[Foo: [Int : [Int : (Int, Int, Int, String)]]] = [
	.bizz: ohMy,
	.bonk: ohMy
]

// ✅
let results:[Foo: _] = [
	.bizz: ohMy,
	.bonk: ohMy
]

Другие примеры

Примеры типов, содержащих заполнители:

Array<_>    // array with placeholder element type
[Int: _]    // dictionary with placeholder value type
(_) -> Int  // function type accepting a single type placeholder argument and returning 'Int'
(_, Double) // tuple type of placeholder and 'Double'
_?          // optional wrapping a type placeholder

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

Вы можете ознакомиться с другими менее известными функциями Swift в моем предыдущем посте:



Рекомендации