Entry tags:
Проверяем идею: SwiftUI поверх Си++
Решил на практике проверить идею насчёт лёгкости привинчивания оконного интерфейса Swift к коду Си++. Взял модель калькулятора TI-2500 и быстренько состряпал к ней простой гуй. Благо, SwiftUI позволяет обходиться даже без XCode IDE. Достаточно простого текстового редактора и компиляции из командной строки.
Собирается и запускается это дело так:

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

Исходники главного окошка: ContentView.swift. Всё довольно просто. На самом деле, сильно помогла книжка. Как в том анекдоте: "купил англо-русский словарь и выучил англо-русский язык". 😀
Собственно стык с Си++, файл ModelProxy.swift:
Собирается и запускается это дело так:
Вот такая загогулина получается:git clone https://github.com/sergev/ti-2500-datamath.git
cd ti-2500-datamath/swiftui
swift build
swift run

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

Исходники главного окошка: ContentView.swift. Всё довольно просто. На самом деле, сильно помогла книжка. Как в том анекдоте: "купил англо-русский словарь и выучил англо-русский язык". 😀
Собственно стык с Си++, файл ModelProxy.swift:
Главное типы правильно преобразовать: свифтовый Character в сишный char, а потом сишный std::string в свифтовый String.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())
}
}
no subject
иметь простой и надёжный способ присобачивать GUI
Собственно, это что-то типа Electron, который не носит с собой Chromium engine.
В моем конкретном случае выглядит довольно привлекательно.
Примеры по ссылке собираются тулчейном MinGW/UCRT из комплекта msys2 без проблем, причем, если собирать с флагами "-static -static-libgcc -static-libstdc++", то полученный .exe-шник (размером около 1 ГБ) заработает сразу на любом современном виндовозе.
1 ГБ - это много, конечно, но после обработки strip остается всего около 250К, что вообще "не деньги".
Думаю, что исполнимый код для линукса и OS/X будет сравнимого размера.
Swift со своим SwiftUI хороши, но уж больно из них Яббловские кости торчат -- не хочу.
Re: иметь простой и надёжный способ присобачивать GUI
Это как раз то самое bloatware, которого я стараюсь избегать. Слишком много левого кода между моим приложением и операционкой поставщика.
Re: иметь простой и надёжный способ присобачивать GUI
Более того, с недавних пор это дело автоматически присутствует _во_всех_ копиях виндовс, ничего и устанавливать не надо.
Я экспериментировал с Windows 10 LTSC build 19041 от октябра 2020 года - там этот рантайм уже на месте.
Подозреваю, что в двух других операционках тоже так - раз уж GUI поддерживается, то и соответствующий Webkit на месте.
Впрочем, у меня случай специфический - GUI нужен для ~ двух десятков существующих/древних утилит, которыми пользуются исключительно внутри конторы, и исключительно виндовозники.
Эти компьютеры не жалко - там и без меня bloatware хватает.
Зато можно элементы ГУЯ, если не весь, кому-то поручить, поскольку любой шалопай нынче умеет малевать HTML-странички.
Собственно, я не спорю и не уговариваю, просто поболтать захотелось.