-rw-r--r-- 518B 30 нояб. 2020 · 411B1E1 · ~1 мин

Swift CouchDB client 1.0.0

swift couchdb swift package vapor open source

Swift CouchDB client library

Закончил новую версию Swift CouchDB client. Теперь она использует только async-http-client в качестве зависимости для http/https-запросов. Совместима с Vapor 4.

Проект на GitHub: https://github.com/makoni/couchdb-swift

[↵] открыть пост swift-couchdb-client-1-0-0.md
-rw-r--r-- 1.9K 29 марта 2020 · C1C7EDD · ~1 мин

Оборачиваем модели в SwiftUI для соответствия Identifiable

swiftui swift шпаргалки

Чтобы использовать массив моделей во вью List в SwiftUI, эти модели должны соответствовать протоколу Identifiable.

Вот пример модели:

struct MyDataModel {
    let title: String
    let message: String
} 

А вот пример вью SwiftUI, в котором хотим показать список:

struct TestView: View {
    var dataArray: [MyDataModel]
    var body: some View {
        List(dataArray) { data in
            VStack {
                Text(data.title)
                Text(data.message)
            }
        }
    }
} 

Если использовать MyDataModel внутри List, Xcode выдаст ошибку:

Ошибка соответствия Identifiable в Xcode

Иногда модель просто так не поменять. Например, она может быть из стороннего SDK, который вы используете в приложении. Но можно написать обёртку для этой структуры, которая соответствует протоколу Identifiable:

struct MyDataModelWrapper: Identifiable {
    var id = UUID()
    var data: MyDataModel
}

let testDataModel = MyDataModel(
    title: "Title 1",
    message: "I wanna be used inside of a List"
)

let wrappedData = MyDataModelWrapper(data: testDataModel)

Тогда вью будет выглядеть так:

struct TestView: View {
    var dataArray: [MyDataModelWrapper] 

    some View {
        List(dataArray) { wrappedData in
            VStack {
                Text(wrappedData.data.title)
                Text(wrappedData.data.message)
            }
        }
    }
}

Готово.

[↵] открыть пост wrapping-models-in-swiftui-for-identifiable-conformance.md
-rw-r--r-- 1.2K 23 сент. 2019 · B28AFA6 · ~1 мин

Синтаксический сахар для парсинга JSON в Swift

swift swift package json open source

Декодирование и кодирование JSON стало простым после появления протокола Codable в Swift 4.0. Но в процессе разработки мне хотелось чего-то более короткого и изящного, чем конструкция Do-Catch вида:

var myModel: MyModel?
let decoder = JSONDecoder()

do {
    myModel = try decoder.decode(MyModel.self, from: data)
} catch {
    print(error.localizedDescription)
}

Или вот такого:

let myModel: MyModel? = try? decoder.decode(MyModel.self, from: data)

Поэтому я написал протокол с реализацией по умолчанию, который позволяет декодировать вот так:

let myModel = MyModel.decodeFromData(data: data)

И так же — кодировать:

let data = MyModel.encode(fromEncodable: myModel)

Всё, что нужно, — добавить соответствие протоколу:

extension MyModel: Parseable {
    typealias ParseableType = Self
}

Доступно на GitHub как Swift Package: https://github.com/makoni/parsable

[↵] открыть пост syntax-sugar-for-json-parsing-in-swift.md
-rw-r--r-- 1013B 10 сент. 2019 · 64BE02E · ~1 мин

GitHub Actions как CI для Swift-проекта

swift github ci шпаргалки

Github Actions

Конфиг workflow для GitHub Actions, который собирает Swift-проект. В примере собирается проект на Vapor с помощью Swift 5.0.3 на Ubuntu 18.04:

name: Ubuntu 18.04 Swift 5.0.3

on: [push]

jobs:
  build_on_ubuntu:
    runs-on: ubuntu-18.04

    steps:
    - name: Install dependencies
      run: sudo apt-get update; sudo apt-get install -yq libssl-dev zlib1g-dev

    - name: Checkout
      uses: actions/checkout@master

    - name: Download Swift
      run: curl https://swift.org/builds/swift-5.0.3-release/ubuntu1804/swift-5.0.3-RELEASE/swift-5.0.3-RELEASE-ubuntu18.04.tar.gz --output swift.tar.gz

    - name: Unpack Swift
      run: |
          tar xzf swift.tar.gz
          mv swift-5.0.3-RELEASE-ubuntu18.04 swift

    - name: Swift build
      run: |
          export PATH=$(pwd)/swift/usr/bin:"${PATH}"
          swift build -c release
[↵] открыть пост using-github-actions-as-ci-for-building-swift-project.md
-rw-r--r-- 2.7K 12 авг. 2019 · C802EF3 · ~2 мин

Поддержка тёмной темы на сайте

dark mode web css

Тёмная тема на сайте

iOS 13, которая выйдет этой осенью, будет включать тёмный режим. В современной macOS он уже есть. Принося тёмный режим в iOS, Apple также рекомендует веб-разработчикам адаптировать цвета под тёмную тему.

Реализовать это довольно просто. Достаточно поменять CSS сайта и добавить что-то вроде такого:

:root {
  color-scheme: light dark;
  --body-background-color: white;
  --body-text-color: #2F2F2F;
}

@media (prefers-color-scheme: dark) {
  :root {
    --body-background-color: #222222;
    --body-text-color: #E2E2E2;
  }
}

body {
  background-color: var(--body-background-color);
  color: var(--body-text-color);
}

То есть мы добавляем поддержку цветовых схем через color-scheme: light dark; и определяем CSS-переменные.

Чтобы протестировать, можно попробовать последний Safari в свежих бетах iOS или macOS, либо (возможно) Safari Developer Preview. В Web Inspector в Safari есть отдельная кнопка для переключения тёмной темы.

Тёмная тема для сайта в Safari

Интересный момент: в macOS 10.15 фон body для тёмной темы по умолчанию тоже тёмный. Но в 10.14 он будет белым в Safari и Firefox. Если хотите поддержать macOS < 10.15, придётся явно задать цвет фона для тёмной схемы. На сессии WWDC Apple про это не упомянули. Они просто убрали свойство background-color из CSS и дали выбирать фон операционной системе. В качестве примера приводили сайт NSHipster, но в его CSS как раз есть свойство background-color — для поддержки старых версий macOS :)

Я добавил поддержку тёмной схемы на свой сайт Space In Box. Загляните также на NSHipster — там тоже есть.

Эта статья — что-то вроде краткого пересказа сессии WWDC Supporting Dark Mode in Your Web Content.

[↵] открыть пост adding-dark-mode-support-for-website.md
-rw-r--r-- 1.5K 1 окт. 2018 · 66FB865 · ~2 мин

Бенчмарки: Vapor 3 vs. Vapor 2

swift backend vapor ubuntu benchmark

После миграции (а по факту почти переписывания) своего небольшого проекта с Vapor 2 на Vapor 3 я прогнал бенчмарки, чтобы сравнить производительность. Я не запускал бенчмарки на последней версии Vapor 2.x, поэтому буду сравнивать Vapor 2.1.0 с результатами Vapor 3.1.0.

Конфигурация моего сервера:

  • 2 ГБ RAM
  • 1 ядро CPU
  • SSD
  • 125 Мбит/с исходящего трафика
  • Ubuntu 16.04.2 LTS
  • CouchDB

Бенчмарк с другого сервера запускался так:

wrk -t4 -c20 -d5m https://my_url

API просто берёт данные из CouchDB и отдаёт их как JSON. Проект на Vapor собирался Swift 4.2.

[↵] открыть пост benchmarks-vapor-3-vs-vapor-2.md
-rw-r--r-- 526B 27 сент. 2018 · 859FE4A · ~1 мин

Select like a Boss для Safari в Mac App Store

select like a boss safari macos расширения приложения open source

Select like a boss for Safari

24 сентября вышла новая версия macOS - Mojave. А вместе с ней и Safari 12, который теперь поддерживает установку расширений только из Mac App Store. Пришлось запилить приложение с расширением.

Загрузить

[↵] открыть пост select-like-a-boss-dlya-safari-v-mac-app-store.md
makoni@arm1:~/blog$ cd ../page-6/ // ← предыдущая cd ./page-8/ // ещё посты →