Arm1.ru

Swift CouchDB client 1.0.0

Finished new version of Swift CouchDB client. Now it's using only async-http-client as dependency to make http/https requests. Can be used with Vapor 4. 

Available on Github: https://github.com/makoni/couchdb-vapor

comment comments
local_offer couchdb swift vapor

Wrapping models in SwiftUI for Identifiable conformance

Using array of models in List view in SwiftUI requires conformance to Identifiable protocol.

Here's an example of model:

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

Example of SwiftUI view that you want to display a list:

struct TestView: View {
    var dataArray: [MyDataModel]

    var body: some View {
        List(dataArray) { data in
            VStack {
                Text(data.title)
                Text(data.message)
            }
        }
    }
}

Using MyDataModel in List will show you error in Xcode:

Sometimes you can't just change the model. It might be a data model from third part SDK that you're using in you app.

But you can create a wrapper for this struct to confirm Identifiable protocol:

struct MyDataModelWrapper: Identifiable {
    var id = UUID()
    var data: MyDataModel
}
let testDataModel = MyDataModel(title: "Title 1", message: "I wanna be used inside of List")
let wrappedData = MyDataModelWrapper(data: testDataModel)

So view will look like this:

struct TestView: View {
    var dataArray: [MyDataModelWrapper]

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

Done.

comment comments
local_offer swiftui swift

Syntax sugar for JSON parsing in Swift

JSON parsing and encoding became easy after adding Codable protocol. But during coding I wanted to have something shorter and more elegant than Do-Catch statement that looks like this:

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

Or like this:

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

So I wrote a protocol with default implementation that allows to do just that:

let myModel = MyModel.decodeFromData(data: data)

And the same for encoding:

let data = MyModel.encode(fromEncodable: myModel)

All you need is just protocol conformance:

extension MyModel: Parseable {
  typealias ParseableType = Self
}

It's available on GitHub and might be used with Swift Package Manager: https://github.com/makoni/parsable

comment comments
local_offer swift package json

Using GitHub Actions as CI for building Swift project

Here's config for GitHub Actions workflow to build a Swift project. This example is for building a Vapor project using Swift 5.0.3 on 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

comment comments
local_offer swift github ci

Adding Dark Mode support for website

iOS 13 coming this fall will include dark mode. Current macOS already has dark mode. With bringing dark mode to iOS Apple also recommends to web developers to adopt colors for dark mode.

It's pretty easy. All you need is to change CSS for your website and add something like that:

: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);
}

So you're adding support for color schemes with color-scheme: light dark; and use CSS variables.

If you need to test it you can try latest Safari in latest betas of iOS or macOS or (maybe) Safari developer preview. Developer tools in Safari has special button to test dark mode.

Interesting: in macOS 10.15 default body background for dark mode is also dark. But in 10.14 it will be white in Safari and Firefox. You need to specify background color for dark scheme if you want to support macOS < 10.15. Apple didn't mention that during WWDC session. All they did was just removing background-color property from CSS to let OS choose background color. They provide NSHipster website as an example but it's CSS also contains background color property in CSS to support previous macOS versions :)

I've added dark scheme support to my Space In Box site. Also check NSHipster site that has it too.

This article is some kind of summary from WWDC video Supporting Dark Mode in Your Web Content.

comment comments
local_offer dark mode web css

Benchmarks: Vapor 3 vs. Vapor 2

After migrating (almost rewriting) my small project from Vapor 2 to Vapor 3 I've run benchmarks to compare performance. I didn't run benchmarks for the last version of Vapor 2.x so I will compare Vapor 2.1.0 to results of Vapor 3.1.0.

My server:

  • 2 GB RAM
  • 1 CPU Core
  • SSD
  • 125 MBPS Out
  • Ubuntu 16.04.2 LTS
  • CouchDB

Benchmark from other server was launched as:

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

API just gets some data from CouchDB and returns it as JSON. Vapor project was compiled with Swift 4.2.

Total requests

 

Requests per second

 

Average Latency

 

Memory usage

 

Vapor 3 was rewriten and now it's based on Apple's NIO. It's faster than Vapor 2 but using more memory which is not critical.

Previous benchmarks:
Benchmarks: Vapor 2 vs. Vapor 1
Benchmarks for Vapor 1.2.5
Swift Backend with CouchDB: Kitura vs. Vapor vs. Node.js

comment comments
local_offer swift backend vapor ubuntu

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

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

Загрузить

comment comments