Простое кроссплатформенных использование модификаторов в SwiftUI

Когда на Catalyst пишется приложение для macOS, недоступны некоторые модификаторы View. Например, простой refreshable(action:). Его использование вызывает ошибку не компиляции, а исключение в рантайме:

[General] SwiftUI.SwiftUI_UIRefreshControl is not supported when running Catalyst apps in the Mac idiom. See UIBehavioralStyle for possible alternatives. Consider using a Refresh menu item bound to ⌘-R

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

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

Для этого воспользуемся сниппетом для определения платформы от Peter Steinberger из этого поста:

И с его помощью реализуем примитивный по своей сути модификатор:

В нём просто возвращаем content на macOS, которая не поддерживает интересующий нас модификатор SwiftUI. К сожалению, непосредственное использование кастомного модификатор предполагает написание некрасивого кода:

Исправим это добавив в проект категорию для View:

Теперь модификатор в коде выглядит нативно:

Приятного кодинга!

Автор: Егор

Автор игры PixelMixel