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

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

Примечание. Вы можете скачать пример проекта и исходные коды этой статьи на GitHub. Чтобы открывать и редактировать эти файлы, вы должны использовать бета-версию Xcode 12.5. Вы можете скачать бета-версию Xcode 12.5 здесь. Вместо того, чтобы скачивать бета-версию Xcode 12.5, вы можете скачать Swift 5.4 прямо здесь.

Самое важное улучшение😄

Любой, кто ранее создавал проект Xcode или файл игровой площадки, знает, что при создании новой игровой площадки или нового проекта Xcode в этом проекте будет записано следующее значение:

var str = "Hello, playground"

Имя этого значения изменилось в Swift 5.4 следующим образом:

var greeting = "Hello, playground"

Да, я думаю, что это интересная и забавная часть Swift 5.4.

Теперь мы можем посмотреть на улучшения, которые действительно работают!

Множественные переменные параметры

В Swift 5.4 мы можем использовать несколько вариативных параметров для функций, методов, индексов и инициализаторов. До Swift 5.4 у нас был только один вариативный параметр, как в приведенном ниже коде:

func method(singleVariadicParameter: String) {}

Теперь мы можем написать несколько вариативных параметров, как в приведенном ниже коде:

func method(multipleVariadicParameter: String..., secondMultipleVariadicParameter: String...) {}

Мы можем вызвать функцию, которую мы написали выше, но, конечно, мы можем написать только один элемент String, если захотим. Вот код:

method(multipleVariadicParameter: "Can", "Steve", "Bill", secondmultipleVariadicParameter: "Tim", "Craig")

Множественные вариативные параметры работают так же, как массивы. Конечно, при вызове значения в параметре необходимо заранее проверить, существует это значение или нет; в противном случае он будет неправильным и выйдет из строя. Вот код:

func chooseSecondPerson(persons: String...) -> String {
    let index = 1
    if persons.count > index {
        return persons[index]
    } else {
        return "There is no second person."
    }
}

Конструкторы результатов

С момента появления SwiftUI построители результатов стали в Swift очень важны. Теперь это намного важнее с новыми улучшениями.

Можем ли мы создать десятки строк с помощью функции, выводящей String? Если мы используем построители результатов, ответ - да!

Мы можем определить новые построители результатов, определив новые структуры с помощью @resultBuilder. Методы и свойства, которые вы определите, должны быть static.

Вернемся к нашему примеру преобразования String элементов в один String элемент. С помощью построителя результатов ниже мы можем объединить String элементов, написанных под ними. Код выглядит следующим образом:

@resultBuilder
struct StringBuilder {
    static func buildBlock(_ strings: String...) -> String {
        strings.joined(separator: "\n")
    }
}

Давайте воспользуемся следующим кодом, чтобы описать это:

let stringBlock = StringBuilder.buildBlock(
    "It really inspires the",
    "creative individual",
    "to break free and start",
    "something different."
)
print(stringBlock)

Нам пришлось использовать метод buildBlock напрямую при определении значения. Поэтому нам пришлось поставить запятую в конце каждого элемента String. Вместо этого мы можем использовать StringBuilder в функции, чтобы делать то же самое без запятых. Вот код:

@StringBuilder func makeSentence() -> String {
    "It really inspires the"
    "creative individual"
    "to break free and start"
    "something different."
}
print(makeSentence())

То, что мы сделали с конструкторами результатов до сих пор, может не иметь большого значения для вас, но если мы будем использовать конструкторы результатов немного более эффективно, вы лучше поймете их возможности. Например, с двумя новыми методами, которые мы добавим в наш построитель результатов, мы можем использовать условия для генерации String элементов с помощью нашего построителя результатов. Код выглядит следующим образом:

@resultBuilder
struct ConditionalStringBuilder {
    static func buildBlock(_ parts: String...) -> String {
        parts.joined(separator: "\n")
    }
    static func buildEither(first component: String) -> String {
        return component
    }
    static func buildEither(second component: String) -> String {
        return component
    }
}

Как видите, создав цикл if, мы можем изменить элемент String в соответствии с логическим значением. Вот результат:

@ConditionalStringBuilder func makeSentence() -> String {
    "It really inspires the"
    "creative individual"
    "to break free and start"
    if Bool.random() {
        "something different."
    } else {
        "thinking different."
    }
}
print(makeSentence())

Есть много вещей, которые можно сделать с помощью конструкторов результатов. Вы можете узнать их, попробовав.

Расширенный синтаксис неявных членов

При определении элемента внутри модификатора нам больше не нужно указывать основной тип этого элемента. Таким образом, вы можете связать вместе несколько свойств или функций-членов, не добавляя тип в начале, как показано ниже:

.transition(.scale.move(…))

После Swift 5.4 мы должны написать этот блок кода ниже для того же результата. Вот строка кода:

.transition(AnyTransistion.scale.move(…))

Функции поддерживают одинаковые имена

Иногда вам нужно написать функции с одинаковыми именами. По крайней мере, я хотел это сделать. С Swift 5.4 мы можем это сделать.

Например, если мы создаем функции с одинаковыми именами - и эти функции имеют одинаковое имя параметра - наш код будет работать, если мы определим эти параметры с разными типами объектов.

Вы можете попробовать написать это ниже:

struct iPhone {}
struct iPad {}
struct Mac {}
func setUpAppleProducts() {
    func setUp(product: iPhone) {
        print("iPhone is bought")
    }
    
    func setUp(product: iPad) {
        print("iPad is bought")
    }
    
    func setUp(product: Mac) {
        print("Mac is bought")
    }
    
    setUp(product: iPhone())
    setUp(product: iPad())
    setUp(product: Mac())
}

Заключение

Надеюсь, вы нашли эту статью полезной. Есть новые сообщения о том, что Swift 6.0 может быть выпущен. Я тоже напишу статью на эту тему.

Спасибо за чтение.

My Other Articles
- Building Cross-Platform Apps With SwiftUI
- How to Create Onboarding Screens in Your iOS App
- How To Use Firebase in SwiftUI’s New Application Lifecycle

Если вы хотите встретиться со мной или у вас есть вопросы о разработке iOS и т. Д., Вы можете встретиться со мной один на один здесь.