vak: (Default)
[personal profile] vak
Решил на практике проверить идею насчёт лёгкости привинчивания оконного интерфейса Swift к коду Си++. Взял модель калькулятора TI-2500 и быстренько состряпал к ней простой гуй. Благо, SwiftUI позволяет обходиться даже без XCode IDE. Достаточно простого текстового редактора и компиляции из командной строки.

Собирается и запускается это дело так:
git clone https://github.com/sergev/ti-2500-datamath.git
cd ti-2500-datamath/swiftui
swift build
swift run
Вот такая загогулина получается:

Сравниваем с оригиналом:



Исходники главного окошка: ContentView.swift. Всё довольно просто. На самом деле, сильно помогла книжка. Как в том анекдоте: "купил англо-русский словарь и выучил англо-русский язык". 😀  

Собственно стык с Си++, файл ModelProxy.swift:
import Foundation
import ModelCxx

class ModelProxy: ObservableObject {
@Published var display: String = ""

static let shared = ModelProxy()

// Allocate C++ object.
private var calc = Calculator()

// Show initial display contents.
func setup() {
calc.run()
display = String(calc.get_display())
}

// Press key.
func send(_ ch: Character) {
calc.press_key(CChar(ch.asciiValue!))
display = String(calc.get_display())
}
}
Главное типы правильно преобразовать: свифтовый Character в сишный char, а потом сишный std::string в свифтовый String.

Date: 2023-12-02 21:39 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Классно!

From: [personal profile] h1uke
А что вы думаете об этом подходе?

Собственно, это что-то типа Electron, который не носит с собой Chromium engine.
В моем конкретном случае выглядит довольно привлекательно.

Примеры по ссылке собираются тулчейном MinGW/UCRT из комплекта msys2 без проблем, причем, если собирать с флагами "-static -static-libgcc -static-libstdc++", то полученный .exe-шник (размером около 1 ГБ) заработает сразу на любом современном виндовозе.
1 ГБ - это много, конечно, но после обработки strip остается всего около 250К, что вообще "не деньги".
Думаю, что исполнимый код для линукса и OS/X будет сравнимого размера.

Swift со своим SwiftUI хороши, но уж больно из них Яббловские кости торчат -- не хочу.


From: [personal profile] h1uke
Насчет bloatware согласен, меня это тоже останавливало. Но потом стало понятно, что от этого рантайма не отвертеться.
Более того, с недавних пор это дело автоматически присутствует _во_всех_ копиях виндовс, ничего и устанавливать не надо.
Я экспериментировал с Windows 10 LTSC build 19041 от октябра 2020 года - там этот рантайм уже на месте.
Подозреваю, что в двух других операционках тоже так - раз уж GUI поддерживается, то и соответствующий Webkit на месте.

Впрочем, у меня случай специфический - GUI нужен для ~ двух десятков существующих/древних утилит, которыми пользуются исключительно внутри конторы, и исключительно виндовозники.
Эти компьютеры не жалко - там и без меня bloatware хватает.
Зато можно элементы ГУЯ, если не весь, кому-то поручить, поскольку любой шалопай нынче умеет малевать HTML-странички.

Собственно, я не спорю и не уговариваю, просто поболтать захотелось.

Date: 2023-12-03 05:08 (UTC)
From: [personal profile] vakhitov
А как по английски стык в данном случае? Interface или binding?