vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2023-12-02 11:58 am

Проверяем идею: SwiftUI поверх Си++

Решил на практике проверить идею насчёт лёгкости привинчивания оконного интерфейса 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.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org