{"id":24810793,"url":"https://github.com/yusukehosonuma/swiftui-common","last_synced_at":"2025-09-15T07:32:29.493Z","repository":{"id":38388497,"uuid":"477963014","full_name":"YusukeHosonuma/SwiftUI-Common","owner":"YusukeHosonuma","description":"SwiftUI components that seem to be highly reusable.","archived":false,"fork":false,"pushed_at":"2023-05-29T11:10:42.000Z","size":518,"stargazers_count":84,"open_issues_count":0,"forks_count":4,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-06-17T19:11:23.894Z","etag":null,"topics":["swiftui","swiftui-components"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/YusukeHosonuma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-04-05T03:37:21.000Z","updated_at":"2025-03-05T02:57:17.000Z","dependencies_parsed_at":"2025-06-17T19:10:50.702Z","dependency_job_id":"6414b482-ca51-4aa5-97c7-a7707a8f0ece","html_url":"https://github.com/YusukeHosonuma/SwiftUI-Common","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/YusukeHosonuma/SwiftUI-Common","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeHosonuma%2FSwiftUI-Common","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeHosonuma%2FSwiftUI-Common/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeHosonuma%2FSwiftUI-Common/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeHosonuma%2FSwiftUI-Common/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/YusukeHosonuma","download_url":"https://codeload.github.com/YusukeHosonuma/SwiftUI-Common/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeHosonuma%2FSwiftUI-Common/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275225263,"owners_count":25427000,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-15T02:00:09.272Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["swiftui","swiftui-components"],"created_at":"2025-01-30T12:18:04.017Z","updated_at":"2025-09-15T07:32:29.447Z","avatar_url":"https://github.com/YusukeHosonuma.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build](https://github.com/YusukeHosonuma/SwiftUI-Common/actions/workflows/main.yml/badge.svg)](https://github.com/YusukeHosonuma/SwiftUI-Common/actions/workflows/main.yml)\n![iOS 14+](https://img.shields.io/badge/iOS-14+-4BC51D.svg?style=flat)\n[![Twitter](https://img.shields.io/twitter/url?style=social\u0026url=https%3A%2F%2Ftwitter.com%2Ftobi462)](https://twitter.com/tobi462)\n\n# SwiftUI-Common\n\nSwiftUI components and extensions that seem to be highly reusable.\n\nSince this is an **experimental library**, we recommend that you copy (or use as refererence) and use the source.\n\n## Control\n\n\n\u003cdetails\u003e\n\u003csummary\u003eHiddenLink\u003c/summary\u003e\n\n[HiddenLink](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/HiddenLink.swift) (`NavigationLink` that label is `EmptyView`)\n\n```swift\nHiddenLink(isActive: $isActive) {\n    ChildView()\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eTextEdit\u003c/summary\u003e\n\n[TextEdit.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/TextEdit.swift) (add placeholder to [TextEditor](https://developer.apple.com/documentation/swiftui/texteditor))\n\n```swift\nTextEdit(\"Please paste.\", text: $text, font: .custom(\"SF Mono\", size: 16))\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eResizableImage\u003c/summary\u003e\n\n[ResizableImage](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/ResizableImage.swift)\n    \nThe [Image](https://developer.apple.com/documentation/swiftui/image) that is resized only if it extends beyond the area.\n\n```swift\n\nGroup {\n    ResizableImage(systemName: \"swift\", contentMode: .fit)\n    ResizableImage(\"island\", contentMode: .fit)\n    ResizableImage(\"island\", contentMode: .fill)\n}\n.frame(width: 140, height: 140)\n.border(.red)\n```\n    \n\u003cimg width=\"317\" src=\"https://user-images.githubusercontent.com/2990285/168200204-dc465a71-c3f1-4b92-98f8-8353f3c8ad46.png\"\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eWebView\u003c/summary\u003e\n\n[WebView.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/WebView.swift) (bridge to [WKWebView](https://developer.apple.com/documentation/webkit/wkwebview))\n\n```swift\n@StateObject var webViewState = WebViewState { _ in\n    // 💡 If you want to more configuration\n    // webView.allowsBackForwardNavigationGestures = true\n}\n\nvar body: some View {\n    ZStack {\n        WebView(url: url, state: webViewState)\n\n        if webViewState.isFirstLoading {\n            ProgressView()\n        }\n\n        // 💡 Note: If you want to display an indicator at each page transition.\n        // if webViewState.isLoading {\n        //     ProgressView()\n        // }\n    }\n    .toolbar {\n        ToolbarItemGroup(placement: .bottomBar) {\n            Spacer()\n\n            // ✅ Back\n            Button {\n                webViewState.goBack()\n            } label: {\n                Image(systemName: \"chevron.backward\")\n            }\n            .enabled(webViewState.canGoBack)\n\n            // ✅ Forward\n            Button {\n                webViewState.goForward()\n            } label: {\n                Image(systemName: \"chevron.forward\")\n            }\n            .enabled(webViewState.canGoForward)\n        }\n    }\n}\n```\n\n\u003cimg width=\"339\" alt=\"image\" src=\"https://user-images.githubusercontent.com/2990285/167335179-0e42798b-fd4c-4844-8eca-c5cb3e6ab666.png\"\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eActivityView\u003c/summary\u003e\n\n[ActivityView](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/UIKit/ActivityView.swift) (bridge to [UIActivityViewController](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller))\n\n```swift\n@State static var isPresent = false\n\nstatic var previews: some View {\n    Image(systemName: \"square.and.arrow.up\")\n        .sheet(isPresented: .constant(true)) {\n            ActivityView(activityItems: [URL(string: \"https://github.com/YusukeHosonuma/SwiftUI-Common\")!])\n        }\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eWindowController\u003c/summary\u003e\n\n[WindowController](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/AppKit/WindowController.swift) (bridge to [NSWindowController](https://developer.apple.com/documentation/appkit/nswindowcontroller))\u003cbr\u003e\nT.B.D\n\u003c/details\u003e\n\n\n## View extensions\n\n[View+.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/View%2B.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003eenabled()\u003c/summary\u003e\n  \n```swift\n@State var isEnabled = false\n\nvar body: some View {\n    VStack {\n        Button(\"Hello\") {}\n            .enabled(isEnabled) // 💡 Same as `.disabled(isEnabled == false)`\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eextend { ... }\u003c/summary\u003e\n\n```swift\nText(\"Hello\")\n    .extend { content in\n        if #available(iOS 15, *) {\n            content\n                .environment(\\.dynamicTypeSize, .xxxLarge)\n        } else {\n            content\n        }\n    }\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003ewhen() { ... }\u003c/summary\u003e\n\n```swift\n@State var condition = false\n\nvar body: some View {\n    Text(\"Hello\")\n        .when(condition) {\n            $0.underline()\n        }\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003ewhenLet() { ... }\u003c/summary\u003e\n\n```swift\n@State var textColor: Color? = .red\n\nvar body: some View {\n    Text(\"Hello\")\n        .whenLet(textColor) { content, textColor in\n            content\n                .foregroundColor(textColor)\n        }\n}\n```\n\u003c/details\u003e\n\n  \n\u003cdetails\u003e\n\u003csummary\u003eborder()\u003c/summary\u003e\n\n```swift\nText(\"Hello\")\n    .padding()\n    .border(.red, edge: .vertical) // default `width` = 1\n    .border(.blue, width: 8, edge: .leading)\n```\n\n\u003cimg width=\"166\" alt=\"image\" src=\"https://user-images.githubusercontent.com/2990285/167331264-ee274f67-ec58-4d79-88b9-61e2fa57d66f.png\"\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003etoggleSidebar()\u003c/summary\u003e\n  \n```swift\nButton(\"toggle\") {\n    toggleSidebar()\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003ehideKeyboard()\u003c/summary\u003e\n  \n```swift\nButton(\"hide\") {\n    hideKeyboard()\n}\n```\n\u003c/details\u003e\n\n[View+Alert.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/View%2BAlert.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003ealert(error: $error)\u003c/summary\u003e\n  \n```swift\nenum MyError: LocalizedError {\n    case warning, fatal\n\n    var errorDescription: String? {\n        switch self {\n        case .warning: return \"Warning\"\n        case .fatal: return \"Fatal\"\n        }\n    }\n\n    var helpMessage: String {\n        switch self {\n        case .warning: return \"This is warning.\"\n        case .fatal: return \"This is fatal.\"\n        }\n    }\n}\n\nstruct ContentView: View {\n    @State var error: MyError? = nil\n\n    var body: some View {\n        VStack {\n            Button(\"Warning\") { error = .warning }\n            Button(\"Fatal\") { error = .fatal }\n        }\n        //\n        // iOS 15+\n        //\n        .alert(error: $error) {}     // ✅ Not need to specify `isPresented: Binding\u003cBool\u003e`.\n        .alert(error: $error) { _ in // 💡 You can specify message.\n            Button(\"OK\") {}\n        } message: { error in\n            Text(error.helpMessage)\n        }\n        //\n        // iOS 14+\n        //\n        .alert(error: $error)\n        .alert(\n            error: $error,\n            message: Text(error?.helpMessage ?? \"unknown\"),\n            dismissButton: .cancel() // Optional\n        )\n    }\n}\n```\n\u003c/details\u003e\n\n\n[View+Debug.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/View%2BDebug.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003edebug { ... }\u003c/summary\u003e\n  \n```swift\nfunc content(number: Int) -\u003e some View {\n    Text(\"\\(number)\")\n        .debug {\n            print(\"number: \\(number)\") // 💡 Any debug code.\n        }\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eprint()\u003c/summary\u003e\n\n```swift\nfunc content(number: Int) -\u003e some View {\n    Text(\"\\(number)\")\n        .print(\"number: \\(number)\") // 💡\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eprintOnChange()\u003c/summary\u003e\n\n```swift\n@State var number: Int = 42\n\nvar body: some View {\n    Text(\"\\(number)\")\n        .printOnChange(\"number: \") { number } // 💡 Print \"number: 42\" when `number is changed.\n}\n```\n\u003c/details\u003e\n\n\n## Binding extension\n\n[Binding+.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/Binding%2B.swift)\u003cbr\u003e\n[SliderValue.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/SliderValue.swift) (e.g. for use `enum` in [Slider](https://developer.apple.com/documentation/swiftui/slider))\n\n\u003cdetails\u003e\n\u003csummary\u003emap()\u003c/summary\u003e\n    \n```swift\n@State var boolString = \"false\"\n\nvar body: some View {\n    VStack {\n        TextField(\"isOn\", text: $boolString)\n            .textFieldStyle(.roundedBorder)\n            .autocapitalization(.none)\n\n        //\n        // 💡 Can edit `String` as `Bool`.\n        //\n        Toggle(\"isOn\", isOn: $boolString.map( // ✅ `Binding\u003cString\u003e` -\u003e `Binding\u003cBool\u003e`\n            get: { $0 == \"true\" },\n            set: { $0 ? \"true\" : \"false\" }\n        ))\n    }\n}\n```\n\u003c/details\u003e\n\n    \n\u003cdetails\u003e\n\u003csummary\u003einverted()\u003c/summary\u003e\n    \n```swift\n@State var isEnabled = false\n\nvar body: some View {\n    Toggle(\"Disable\", isOn: $isEnabled.inverted()) // ✅ `true` -\u003e `false` and `false` -\u003e true`\n    Text(\"isEnabled: \\(isEnabled ? \"True\" : \"False\")\")\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eoptional()\u003c/summary\u003e\n\n```swift\nenum Menu: Int {\n    case all\n    case star\n}\n\nstruct BindingOptionalView: View {\n    @SceneStorage(\"selection\") var selection: Menu = .all\n\n    var body: some View {\n        let optionalSelection = $selection.optional() // 💡 `Binding\u003cMenu\u003e` -\u003e `Binding\u003cMenu?`\n        NavigationView {\n            List {\n                NavigationLink(tag: Menu.all, selection: optionalSelection, destination: { Text(\"1\") }) {\n                    Text(\"One\")\n                }\n                NavigationLink(tag: Menu.star, selection: optionalSelection, destination: { Text(\"2\") }) {\n                    Text(\"Two\")\n                }\n            }\n        }\n    }\n}\n```\n\u003c/details\u003e\n\n  \n\u003cdetails\u003e\n\u003csummary\u003ewrapped()\u003c/summary\u003e\n\n```swift\n@Binding var optionalString: String?\n\nvar body: some View {\n    if let binding = $optionalString.wrapped() { // 💡 `Binding\u003cString?\u003e` -\u003e `Binding\u003cString\u003e?`\n        TextField(\"placeholder\", text: binding)\n    } else {\n        Text(\"nil\")\n    }\n}\n```\n\u003c/details\u003e\n\n    \n\u003cdetails\u003e\n\u003csummary\u003ecase()\u003c/summary\u003e\n    \n```swift\nimport CasePaths // ✅ Required `pointfreeco/swift-case-paths`\nimport SwiftUI\n\nenum EnumValue {\n    case string(String) // 💡 Has associated-type `String`\n    case bool(Bool)     // 💡 Has associated-type `Bool`\n}\n\nstruct CaseBindingView: View {\n    @State var value: EnumValue = .string(\"Swift\")\n\n    var body: some View {\n        VStack {\n            //\n            // 💡 Note: `switch` statement is only for completeness check by compiler.\n            // (Removal does not affect the operation)\n            //\n            switch value {\n            case .string:\n                //\n                // ✅ Binding\u003cValue\u003e -\u003e Binding\u003cString\u003e?\n                //\n                if let binding = $value.case(/EnumValue.string) {\n                    TextField(\"placeholder\", text: binding)\n                }\n\n            case .bool:\n                //\n                // ✅ Binding\u003cValue\u003e -\u003e Binding\u003cInt\u003e?\n                //\n                if let binding = $value.case(/EnumValue.bool) {\n                    Toggle(\"isOn\", isOn: binding)\n                }\n            }\n        }\n    }\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eslider()\u003c/summary\u003e\n\n```swift\n// 💡 Want to edit by slider.\nenum TextSize: Int, CaseIterable {\n    case xSmall = 0\n    case small = 1\n    ...\n\n    var name: String {\n        switch self {\n        case .xSmall: return \"xSmall\"\n        case .small: return \"small\"\n        ...\n    }\n}\n\n// ✅ Implement `SliderValue` protocol.\nextension TextSize: SliderValue {\n    static let sliderRange: ClosedRange\u003cDouble\u003e = 0 ... Double(TextSize.allCases.count - 1)\n\n    var sliderIndex: Int { rawValue }\n\n    init(fromSliderIndex index: Int) {\n        self = Self(rawValue: index)!\n    }\n}\n  \nstruct SliderView: View {\n    @State var textSize: TextSize = .medium\n\n    var body: some View {\n        VStack {\n            Text(\"\\(textSize.name)\")\n            Slider(\n                value: $textSize.slider(), // 💡 `Binding\u003cTextSize\u003e` -\u003e `Binding\u003cDouble\u003e`\n                in: TextSize.sliderRange,\n                step: 1\n            )\n        }\n        .padding()\n    }\n}\n```\n\n\u003cimg width=\"333\" alt=\"image\" src=\"https://user-images.githubusercontent.com/2990285/167333536-031af3f8-86ce-46bd-81e4-6dc63f51eb2c.png\"\u003e\n\u003c/details\u003e\n\n## CGSize extensions\n\n[CGSize+.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/CGSize%2B.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003eComparable\u003c/summary\u003e\n\n```swift\nlet a = CGSize(width: 10, height: 20)\nlet b = CGSize(width: 5, height: 10)\na \u003c b // 💡 Alias for `a.width \u003c b.width \u0026\u0026 a.height \u003c b.height`\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eAdditiveArithmetic\u003c/summary\u003e\n\n```swift\nlet a = CGSize(width: 10, height: 20)\nlet b = CGSize(width: 5, height: 10)\na + b // 💡 Alias for `CGSize(width: a.width + b.width, height: a.height + b.height)\na - b // 💡 Alias for `CGSize(width: a.width - b.width, height: a.height - b.height)\n```\n\u003c/details\u003e\n\n    \n## Image extensions\n\n[Image+.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/Image%2B.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003einit(UIImage or NSImage)\u003c/summary\u003e\n\n```swift\n#if os(macOS)\nprivate typealias XImage = NSImage\n#else\nprivate typealias XImage = UIImage\n#endif\n\nstruct ImageView: View {\n    var body: some View {\n        Image(image: renderImage()) // 💡\n            .resizable()\n            .scaledToFit()\n    }\n\n    private func renderImage() -\u003e XImage {\n        // ⚠️ Assumes rendering code\n        #if os(macOS)\n        NSImage(named: \"picture\")!\n        #else\n        UIImage(named: \"picture\")!\n        #endif\n    }\n}\n```\n\u003c/details\u003e\n\n    \n## Compatible iOS 15+ (Can be used in iOS 14+)\n\n[Section+iOS15.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/Compatible/Section%2BiOS15.swift)\u003cbr\u003e\n[@Dismiss](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/Compatible/Dismiss.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003eSection\u003c/summary\u003e\n    \n```swift\nSection(\"title\") {\n    ...\n}\n```\n\u003c/details\u003e\n    \n\u003cdetails\u003e\n\u003csummary\u003e@Dismiss\u003c/summary\u003e\n\n```swift\n// ✅ Compatible to `@Environment(\\.dismiss) var dismiss` in iOS 15.\n@Dismiss var dismiss\n\n// 💡 in iOS 14+\n// @Environment(\\.presentationMode) private var presentationMode\n\nvar body: some View {\n    VStack {\n        Button(\"Close\") {\n            // ✅ Same as `@Environment(\\.dismiss)`\n            dismiss()\n\n            // 💡 in iOS 14\n            // presentationMode.wrappedValue.dismiss()\n        }\n    }\n    .padding()\n}\n```\n\u003c/details\u003e\n\n\n## Misc\n  \n[Space.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/View/Space.swift.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003eSpace(...)\u003c/summary\u003e\n    \n```swift\n// Alias for `Spacer().frame(width: 10)`\nSpace(width: 10)\n\n// Alias for `Spacer().frame(height: 10)`\nSpace(height: 10)\n```\n\u003c/details\u003e\n\n\n## Concurrency extensions\n  \n[Task+.swift](https://github.com/YusukeHosonuma/SwiftUI-Common/blob/main/Sources/SwiftUICommon/Extension/Task%2B.swift)\n\n\u003cdetails\u003e\n\u003csummary\u003esleep()\u003c/summary\u003e\n    \n```swift\nTask {\n    try await Task.sleep(seconds: 1)        // 1 s\n    try await Task.sleep(milliseconds: 500) // 500 ms\n}\n```\n\u003c/details\u003e\n\n    \n## Install\n\nIf you want.\n\n```swift\nlet package = Package(\n    dependencies: [\n        .package(url: \"https://github.com/YusukeHosonuma/SwiftUI-Common.git\", from: \"1.0.0\"),\n    ],\n    targets: [\n        .target(name: \"\u003cyour-target-name\u003e\", dependencies: [\n             .product(name: \"SwiftUICommon\", package: \"SwiftUI-Common\"),\n        ]),\n    ]\n)\n```\n\n## Development\n\nSetup:\n\n```sh\nmake setup\n```\n\nFormat:\n\n```sh\nmake format\n```\n\n## Links\n\n- This library is used in the following:\n  - [SwiftUI-Simulator](https://github.com/YusukeHosonuma/SwiftUI-Simulator)\n  - [UserDefaults-Browser](https://github.com/YusukeHosonuma/UserDefaultsBrowser)\n  - [Swift-Evolution-Browser](https://github.com/YusukeHosonuma/Swift-Evolution-Browser) \n  - [E2DC](https://github.com/YusukeHosonuma/E2DC)\n- Document (Japanese):\n  - [Effective SwiftUI 候補（仮説）](https://github.com/YusukeHosonuma/Effective-SwiftUI)\n\n## Author\n\nYusuke Hosonuma / [@tobi462](https://twitter.com/tobi462)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyusukehosonuma%2Fswiftui-common","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyusukehosonuma%2Fswiftui-common","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyusukehosonuma%2Fswiftui-common/lists"}