![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Решил на практике проверить идею насчёт лёгкости привинчивания оконного интерфейса 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
Date: 2023-12-02 21:39 (UTC)Классно!
no subject
Date: 2023-12-03 05:42 (UTC)иметь простой и надёжный способ присобачивать GUI
Date: 2023-12-29 00:23 (UTC)Собственно, это что-то типа Electron, который не носит с собой Chromium engine.
В моем конкретном случае выглядит довольно привлекательно.
Примеры по ссылке собираются тулчейном MinGW/UCRT из комплекта msys2 без проблем, причем, если собирать с флагами "-static -static-libgcc -static-libstdc++", то полученный .exe-шник (размером около 1 ГБ) заработает сразу на любом современном виндовозе.
1 ГБ - это много, конечно, но после обработки strip остается всего около 250К, что вообще "не деньги".
Думаю, что исполнимый код для линукса и OS/X будет сравнимого размера.
Swift со своим SwiftUI хороши, но уж больно из них Яббловские кости торчат -- не хочу.
Re: иметь простой и надёжный способ присобачивать GUI
Date: 2023-12-29 01:41 (UTC)Это как раз то самое bloatware, которого я стараюсь избегать. Слишком много левого кода между моим приложением и операционкой поставщика.
Re: иметь простой и надёжный способ присобачивать GUI
Date: 2023-12-29 02:19 (UTC)Более того, с недавних пор это дело автоматически присутствует _во_всех_ копиях виндовс, ничего и устанавливать не надо.
Я экспериментировал с Windows 10 LTSC build 19041 от октябра 2020 года - там этот рантайм уже на месте.
Подозреваю, что в двух других операционках тоже так - раз уж GUI поддерживается, то и соответствующий Webkit на месте.
Впрочем, у меня случай специфический - GUI нужен для ~ двух десятков существующих/древних утилит, которыми пользуются исключительно внутри конторы, и исключительно виндовозники.
Эти компьютеры не жалко - там и без меня bloatware хватает.
Зато можно элементы ГУЯ, если не весь, кому-то поручить, поскольку любой шалопай нынче умеет малевать HTML-странички.
Собственно, я не спорю и не уговариваю, просто поболтать захотелось.
no subject
Date: 2023-12-03 05:08 (UTC)no subject
Date: 2023-12-03 05:39 (UTC)https://www.swift.org/documentation/cxx-interop/