Заполнители типов были недавно введены в 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 в моем предыдущем посте: