Home ja - Tai-Kimura/SwiftJsonUI GitHub Wiki
UIKitãšSwiftUIã®äž¡æ¹ããµããŒãããJSONé§åã®iOS UIãã¬ãŒã ã¯ãŒã¯ã ã·ã³ãã«ãªJSONå®çŸ©ãšèªåã³ãŒãçæã§ãã€ãã£ãiOSã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããŸãã
- ðïž ã»ã¯ã·ã§ã³ããŒã¹ã¢ãŒããã¯ãã£: SwiftUI åãã« CollectionDataSource ãåèšèš
- ð æè»ãªã¬ã€ã¢ãŠã: ã»ã¯ã·ã§ã³ããšã«ç°ãªãã«ã©ã æ°ãšã»ã«ã¿ã€ã
- ð å®å šã¢ãŒããµããŒã: Dynamic ãš Static ã¢ãŒããåãããã«åäœ
-
âïž ã¹ã¯ããŒã«ãªãã·ã§ã³: ã€ã³ãžã±ãŒã¿ãŒå¶åŸ¡ä»ãæ°Žå¹³/åçŽ
-
ð ãã€ã³ãã£ã³ã°ããããã£:
@propertyNameæ§æã§åæ¹åãã€ã³ãã£ã³ã° -
ð JSON ãã€ã³ãã£ã³ã°:
@{propertyName}ã§ ViewModel ã«ãã€ã³ã
-
ð¯ SwiftUI ã«ã¹ã¿ã ã³ã³ããŒãã³ã:
sjui g converterãã«ã¹ã¿ã ã³ã³ããŒãã³ããçæ - ð 3ã€ã®ãã¡ã€ã«çæ: Swift ã³ã³ããŒãã³ããRuby ã³ã³ããŒã¿ãŒãDynamic ã¢ããã¿ãŒ
- ð¥ ããããªããŒããµããŒã: ã«ã¹ã¿ã ã³ã³ããŒãã³ããããããªããŒãã§åäœ
JSONã§äžåºŠæžãã°ãUIKitãšSwiftUIã®äž¡æ¹ã«ãããã€ïŒ
- çµ±äžJSONãã©ãŒããã - åäžã®å®çŸ©ã§äž¡ãã©ãããã©ãŒã ã«å¯Ÿå¿
- èªåMVVMçæ - SwiftUIçšã®ViewModelãšããŒã¿ã¢ãã«ãèªåäœæ
- ã¹ããŒãã¢ãŒãåãæ¿ã - ViewSwitcherãDebug/Releaseãã«ããèªåæé©å
- å®å šãªæ©èœããªã㣠- ãã¹ãŠã®ã³ã³ããŒãã³ããäž¡ãã©ãããã©ãŒã ã§ã·ãŒã ã¬ã¹ã«åäœ
-
æç¢ºãªæ§é -
uikitãšswiftuiãã©ã«ãã§å®è£ ãæç¢ºã«åé¢ -
匷åãããCLIããŒã« -
sjui_toolsãbinding_builderã眮ãæããæ©èœãæ¡åŒµ - ããã©ãŒãã³ã¹åäž - éçºçšã®Dynamicã¢ãŒããæ¬çªçšã®Staticã¢ãŒã
- iOS 16.0+
- Swift 5.8+
- Xcode 14.0+
- Node.jsïŒéçºããŒã«çšïŒ
Package.swiftã«è¿œå ïŒ
dependencies: [
.package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.1.2")
]# ã¯ã³ã©ã€ã³ã€ã³ã¹ããŒã©ãŒïŒæšå¥šïŒ
curl -fsSL https://raw.githubusercontent.com/Tai-Kimura/SwiftJsonUI/master/installer/bootstrap.sh | bash
# ãŸãã¯ç¹å®ããŒãžã§ã³ãã€ã³ã¹ããŒã«
curl -fsSL https://raw.githubusercontent.com/Tai-Kimura/SwiftJsonUI/master/installer/bootstrap.sh | bash -s -- -v 7.0.0cd sjui_tools
# ãã©ãããã©ãŒã ãéžæ
sjui_tools/bin/sjui init --mode uikit # UIKitã®ã¿
sjui_tools/bin/sjui init --mode swiftui # SwiftUIã®ã¿
sjui_tools/bin/sjui init --mode all # äž¡ãã©ãããã©ãŒã
# ãããžã§ã¯ãæ§é ãã»ããã¢ãã
sjui_tools/bin/sjui setupSwiftUIã®å ŽåïŒ
sjui_tools/bin/sjui g view HomeView --root以äžãçæãããŸãïŒ
-
View/HomeView/HomeViewView.swift- ç·šéå¯èœãªãã¥ãŒ -
View/HomeView/HomeViewGeneratedView.swift- èªåçæããããã¥ãŒ -
ViewModel/HomeViewViewModel.swift- ããžãã¹ããžãã¯ãå«ãViewModel -
Data/HomeViewData.swift- ããŒã¿ã¢ãã« -
Layouts/home_view.json- JSONã¬ã€ã¢ãŠãå®çŸ©
UIKitã®å ŽåïŒ
sjui_tools/bin/sjui g view Home --root以äžãçæãããŸãïŒ
-
View/Home/HomeViewController.swift- ãã¥ãŒã³ã³ãããŒã©ãŒ -
Layouts/home.json- JSONã¬ã€ã¢ãŠã -
Bindings/HomeBinding.swift- çæããããã€ã³ãã£ã³ã°ïŒãã«ãåŸïŒ
Layouts/home_view.jsonãç·šéïŒ
{
"type": "SafeAreaView",
"id": "main_container",
"background": "#FFFFFF",
"child": [
{
"type": "Label",
"id": "welcome_text",
"text": "SwiftJsonUI 7.0ãžããããïŒ",
"fontSize": 24,
"fontColor": "#000000",
"textAlign": "Center"
},
{
"type": "Button",
"id": "get_started",
"text": "ã¯ããã",
"onClick": "handleGetStarted",
"background": "#007AFF",
"fontColor": "#FFFFFF",
"cornerRadius": 8,
"padding": [12, 24]
}
]
}# ãã€ã³ãã£ã³ã°/ãã¥ãŒãçæ
sjui_tools/bin/sjui build
# ããããªããŒããéå§ããŠå³åº§ã«æŽæ°
sjui_tools/bin/sjui hotload listenYourApp/
âââ Layouts/ # JSONå®çŸ©
âââ View/ # SwiftUIãã¥ãŒ
â âââ HomeView/
â âââ HomeViewView.swift # ç·šéå¯èœ
â âââ HomeViewGeneratedView.swift # èªåçæ
âââ ViewModel/ # ViewModels
âââ Data/ # ããŒã¿ã¢ãã«
YourApp/
âââ Layouts/ # JSONå®çŸ©
âââ View/ # ViewControllers
âââ Bindings/ # çæããããã€ã³ãã£ã³ã°
âââ Core/ # åºåºã¯ã©ã¹
åã³ã³ãã€ã«ããã«å€æŽãå³åº§ã«ç¢ºèªïŒ
# ãµãŒããŒãèµ·å
sjui_tools/bin/sjui hotload listen
# JSONãã¡ã€ã«ãç·šé - 倿Žãå³åº§ã«åæ
# UIKitãšSwiftUIã®äž¡æ¹ã§åäœãã¹ãŠã®ã³ã³ããŒãã³ããäž¡ãã©ãããã©ãŒã ã§åäœïŒ
| ã³ã³ããŒãã³ã | UIKit | SwiftUI |
|---|---|---|
| Label | â å®å š | â å®å š |
| Button | â å®å š | â å®å š |
| TextField | â å®å š | â å®å š |
| Image | â å®å š | â å®å š |
| ScrollView | â å®å š | â å®å š |
| Table/List | â å®å š | |
| Collection | â å®å š | â å®å š |
| ãã®ä»20以äž... |
{
"type": "View",
"id": "my_view",
"width": "matchParent",
"height": "wrapContent",
"child": [...]
}{
"data": [
{
"name": "userName",
"class": "String",
"defaultValue": "ã²ã¹ã"
}
],
"child": [
{
"type": "Label",
"text": "@{userName}" // èªåãã€ã³ãã£ã³ã°
}
]
}Styles/ã«åå©çšå¯èœãªã¹ã¿ã€ã«ãäœæïŒ
{
"background": "#007AFF",
"fontColor": "#FFFFFF",
"cornerRadius": 8,
"padding": 12
}ã¬ã€ã¢ãŠãã§äœ¿çšïŒ
{
"type": "Button",
"style": "primary_button",
"text": "ã¯ãªãã¯"
}# ãããžã§ã¯ãã»ããã¢ãã
sjui init [--mode uikit|swiftui|all] # ãããžã§ã¯ãåæå
sjui setup # æ§é äœæ
# ãã¥ãŒçæ
sjui g view <åå> [--root] # ãã¥ãŒãçæ
sjui g collection <View>/<Cell> # ã³ã¬ã¯ã·ã§ã³ã»ã«ãçæ
sjui g partial <åå> # åå©çšå¯èœãªããŒã·ã£ã«ãçæ
sjui g converter <åå> [options] # ã«ã¹ã¿ã ã³ã³ããŒãã³ããçæ
sjui d view <åå> # ãã¥ãŒãåé€
# ãã«ã
sjui build [--mode uikit|swiftui|all] # ã³ãŒãçæ
sjui build --clean # ãã£ãã·ã¥ãã¯ãªã¢ããŠåãã«ã
# ããããªããŒã
sjui hotload listen # ãµãŒããŒèµ·å
sjui hotload stop # ãµãŒããŒåæ¢
# ãŠãŒãã£ãªãã£
sjui convert to-group [--force] # Xcode 16äºææ§ãã«ãèšå®ã«åºã¥ãèªåæé©åïŒ
- DEBUG: Dynamicã¢ãŒã - é«ééçºã®ããã©ã³ã¿ã€ã ã§JSONãèªã¿èŸŒã¿
- RELEASE: Staticã¢ãŒã - æé©ãªããã©ãŒãã³ã¹ã®ããçæã³ãŒãã䜿çš
// çæã³ãŒãã§èªåå
ViewSwitcher(
isDynamicMode: isDynamicMode,
dynamicView: { DynamicComponent(...) },
staticView: { YourGeneratedView(...) }
){
"include": "header",
"variables": {
"title": "ããããã@{userName}"
}
}{
"type": "Button",
"onClick": "handleTap", // ã¡ãœãããã€ã³ãã£ã³ã°
"onLongPress": {
"closure": "handleLongPress",
"duration": 0.5
}
}# UITableView/UICollectionViewçšã®ã³ã¬ã¯ã·ã§ã³ã»ã«ãçæ
sjui g collection ProductList/ProductCell
# 以äžãäœæãããŸãïŒ
# - View/ProductList/Collection/ProductCell.swift
# - Layouts/product_cell.json# åå©çšå¯èœãªããŒã·ã£ã«ã³ã³ããŒãã³ããçæ
sjui g partial header
# ã¬ã€ã¢ãŠãã§ã®äœ¿ç𿹿³ïŒ
{
"include": "header"
}ããŒã·ã£ã«ãšincludeã®è©³çްã«ã€ããŠã¯Include-Systemãåç §ããŠãã ããã
ãã¹ãŠã®ã³ã³ããŒãã³ãã®ããã©ã«ãå€ãã«ã¹ã¿ãã€ãºïŒ
class UIViewCreator: SJUIViewCreator {
class func prepare() {
defaultFont = "System"
defaultFontSize = 14.0
defaultFontColor = UIColor.label
// ã«ã¹ã¿ãã€ãºã远å
}
}sjui.config.jsonïŒ
{
"project_name": "YourApp",
"mode": "swiftui", // ãŸã㯠"uikit" ãŸã㯠"all"
"layouts_directory_name": "Layouts",
"styles_directory_name": "Styles"
}- All-Attributes - ãã¹ãŠã®ã³ã³ããŒãã³ãã®å®å šãªå±æ§ãªãã¡ã¬ã³ã¹
- View Types-ja - å©çšå¯èœãªã³ã³ããŒãã³ãã¿ã€ã
- Attributes-ja - ã³ã¢å±æ§ã·ã¹ãã
- Data-Binding - ããŒã¿ãã€ã³ãã£ã³ã°ã·ã¹ãã ãåŒããã€ã³ãã£ã³ã°ã°ã«ãŒã
- Include-System - ã³ã³ããŒãã³ãã®åæãšåå©çšæ§
- Advanced-Features - ã€ãã³ãåŠçããžã§ã¹ãã£ãŒãã·ã£ããŠãªã©
- Converter-Command-ja - ã«ã¹ã¿ã SwiftUIã³ã³ããŒãã³ãã®çæ
- VSCode-Extension-ja - èªåè£å®ãšãã³ãã¬ãŒãä»ãå ¬åŒVSCodeæ¡åŒµæ©èœ
- External-Libraries-Integration-ja - ãµãŒãããŒãã£ã©ã€ãã©ãªã®çµ±å
- SwiftJsonUI-7.1.2-Release-Notes-ja - ææ°ã®ãªãªãŒã¹ããŒã
- SwiftJsonUI-7.1.1-Release-Notes-ja - ãã€ã³ãã£ã³ã°ããããã£ãªãªãŒã¹
- SwiftJsonUI-7.1.0-Release-Notes-ja - ã«ã¹ã¿ã ã³ã³ããŒãã³ããªãªãŒã¹
- SwiftJsonUI-7.0.0-Changes - 7.0ã®è©³çްãªå€æŽãã°
- ã³ã³ããŒãã³ãããã¥ã¡ã³ã - LabelãButtonãTextFieldãªã©
SwiftJsonUIã»ããã¢ããã瀺ãå®å šãªãã¢ãããžã§ã¯ãïŒ
git clone https://github.com/Tai-Kimura/bindingTestApp.git
cd bindingTestApp
./bindingTestApp/clear_and_setup.sh- Package.swiftãããŒãžã§ã³7.0.0ã«æŽæ°
-
binding_builderåç §ãsjui_toolsã«å€æŽ -
bindingãã©ã«ãåç §ãuikitã«æŽæ° - ææ°ããŒãžã§ã³ã§CLIããŒã«ãåã€ã³ã¹ããŒã«
-
sjui init --modeã§ãã©ãããã©ãŒã ã¢ãŒããéžæ
- ãã©ãããã©ãŒã ãéžæ - UIKitãSwiftUIã®ããããã§éå§ããå¿ èŠã«å¿ããŠåŸã§ä»æ¹ã远å
- ããããªããŒããäœ¿çš - UIéçºãåçã«é«éå
- ãµããã£ã¬ã¯ããªã§æŽç - æ©èœããšã«é¢é£ã¬ã€ã¢ãŠããã°ã«ãŒãå
- åå©çšå¯èœãªã¹ã¿ã€ã«ãäœæ - äžåºŠå®çŸ©ããŠã©ãã§ã䜿çš
-
ããŒã¿ãã€ã³ãã£ã³ã°ãæŽ»çš - èªåæŽæ°ã®ãã
@{}æ§æã䜿çš
ã³ãã³ããèŠã€ãããªãïŒ
# sjui_toolsãã£ã¬ã¯ããªã«ããããšã確èª
cd sjui_tools
# å®è¡å¯èœã«ãã
chmod +x bin/sjuiããããªããŒããåäœããªãïŒ
# Node.jsã€ã³ã¹ããŒã«ã確èª
node --version
# ãµãŒããŒãåèµ·å
sjui hotload stop && sjui hotload listenãã«ããšã©ãŒïŒ
# ã¯ãªãŒã³ããŠåãã«ã
sjui build --clean
# JSONæ§æããã§ãã¯
sjui validate- Issues: GitHub Issues
- Wiki: ããã¥ã¡ã³ã
- ãµã³ãã«: ãµã³ãã«ãããžã§ã¯ã
SwiftJsonUIã¯MITã©ã€ã»ã³ã¹ã§å©çšå¯èœã§ãã