Generic Cross Platform Signal Handler

Overview

APIDoc Build Status - Master macOS iOS Linux Apache 2 Slack Status

Signals

Generic Cross Platform Signal Handler.

Prerequisites

Swift

  • Swift Open Source swift-4.0.0-RELEASE toolchain (Minimum REQUIRED for latest release)
  • Swift Open Source swift-4.2-RELEASE toolchain (Recommended)
  • Swift toolchain included in Xcode Version 10.0 (10A255) or higher.

macOS

  • macOS 10.11.6 (El Capitan) or higher.
  • Xcode Version 9.0 or higher using one of the above toolchains.
  • Xcode Version 10.0 (10A255) or higher using the included toolchain (Recommended).

iOS

  • iOS 10.0 or higher
  • Xcode Version 9.0 or higher using one of the above toolchains.
  • Xcode Version 10.0 (10A255) or higher using the included toolchain (Recommended).

Linux

  • Ubuntu 16.04 (or 16.10 but only tested on 16.04).
  • One of the Swift Open Source toolchain listed above.

Build

To build Signals from the command line:

% cd <path-to-clone>
% swift build

Using Signals

Including in your project

Swift Package Manager

To include BlueSignals into a Swift Package Manager package, add it to the dependencies attribute defined in your Package.swift file. You can select the version using the majorVersion and minor parameters. For example:

	dependencies: [
		.Package(url: "https://github.com/IBM-Swift/BlueSignals.git", majorVersion: <majorVersion>, minor: <minor>)
	]

Carthage

To include BlueSignals in a project using Carthage, add a line to your Cartfile with the GitHub organization and project names and version. For example:

	github "IBM-Swift/BlueSignals" ~> <majorVersion>.<minor>

CocoaPods

To include BlueSignals in a project using CocoaPods, you just add BlueSignals to your Podfile, for example:

    platform :ios, '10.0'

    target 'MyApp' do
        use_frameworks!
        pod 'BlueSignals'
    end

Before starting

The first thing you need to do is import the Signals framework. This is done by the following:

import Signals

Provided APIs

Signals provides four (4) class level APIs. Three (3) are used for trapping and handling operating system signals. The other function allows for the raising of a signal.

Trapping a signal

  • trap(signal signal: Signal, action: SigActionHandler) - This basic API allows you to set and specific handler for a specific signal.

The example below shows how to add a trap handler to a server in order to perform and orderly shutdown in the event that user press ^C which sends the process a SIGINT.

import Signals

...

let server: SomeServer = ...

Signals.trap(signal: .int) { signal in

	server.shutdownServer()
}

server.run()

Additionally, convenience API's that build on the basic API specified above are provided that will allow for trapping multiple signals, each to a separate handler or to a single handler.

  • trap(signals signals: [(signal: Signal, action: SigActionHandler)]) - This lets you trap multiple signals to separate handlers in a single function call.
  • trap(signals signals: [Signal], action: SigActionHandler) - This API lets you trap multiple signals to a common handler.

Raising a signal

  • raise(signal signal: Signal) - This API is used to send an operating system signal to your application.

This example illustrates how to use Signals to raise a signal with the OS, in this case SIGABRT.

import Signals

...

Signals.raise(signal: .abrt)

Ignoring a signal

  • func ignore(signal: Signal) - This API is used to ignore an operating system signal.

This example illustrates how to use Signals to ignore a signal with the OS, in this case SIGPIPE.

import Signals

...

Signals.ignore(signal: .pipe)

Restoring a signals default handler

  • func restore(signal: Signal) - This API is used to restore an operating system signals default handler.

This example illustrates how to use Signals to restore a signals default handler, in this case SIGPIPE.

import Signals

...

Signals.restore(signal: .pipe)

Adding a USER-DEFINED signal

This example shows how to add a user defined signal, add a trap handler for it and then raise the signal.

import Signals

let mySignal = Signals.Signal.user(20)

Signals.trap(signal: mySignal) { signal in

	print("Received signal \(signal)")
}

Signals.raise(signal: mySignal)

The output of the above snippet is:

Received signal 20

Community

We love to talk server-side Swift and Kitura. Join our Slack to meet the team!

License

This library is licensed under Apache 2.0. Full license text is available in LICENSE.

Comments
  • Fix for the `Invalid Exclude` warnings in Xcode 13

    Fix for the `Invalid Exclude` warnings in Xcode 13

    Fix for the Invalid Exclude warnings in Xcode 13

    Description

    I removed the invalid exclusions and updated the .gitignore file as seen on other IBM-Swift projects after the update to Xcode 13.

    How Has This Been Tested?

    Tested on my project using the forked repo. Warnings resolved and package working as expected.

    Checklist:

    • [x] I have submitted a CLA form
    • [x] If applicable, I have updated the documentation accordingly.
    • [x] If applicable, I have added tests to cover my changes.

    I'm part of IBM org so I don't know if I need to submit a CLA form. Close #26

    opened by SMartorelli 7
  • Build fails with Swift 4.2 on Ubuntu 16.04

    Build fails with Swift 4.2 on Ubuntu 16.04

    We recently added a 4.2 CI build on Kitura which failed.
    It seems BlueSignals is failing to build on Swift 4.2.

    This is the error message I'm seeing:

    BlueSignals/Sources/Signals/Signals.swift:111:36: error: converting non-escaping value to 'T' may allow it to escape
                            sigAction.__sigaction_handler = unsafeBitCast(action, to: sigaction.__Unnamed_union___sigaction_handler.self)
    
    opened by DunnCoding 5
  • Compilation failure with Swift 5.1

    Compilation failure with Swift 5.1

    Attempting to build BlueSignals on Linux (or a project which depends on it - such as Kitura) with the latest Swift 5.1 snapshot (swift-5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a) fails with:

    Incorrect reconstructed type for $sSay7SignalsAAC6SignalO6signal_ys5Int32VXC6actiontGD
    Original type:
    (bound_generic_struct_type decl=Swift.(file).Array
      (tuple_type num_elements=2
        (tuple_type_elt name=signal
          (enum_type decl=Signals.(file).Signals.Signal@/home/djones6/swift501/Kitura/.build/checkouts/BlueSignals/Sources/Signals/Signals.swift:38:14
            (parent=class_type decl=Signals.(file).Signals@/home/djones6/swift501/Kitura/.build/checkouts/BlueSignals/Sources/Signals/Signals.swift:31:14)))
        (tuple_type_elt name=action
          (function_type representation=c escaping
            (input=function_params num_params=1
              (param
                (struct_type decl=Swift.(file).Int32)))
            (output=tuple_type num_elements=0)))))
    Reconstructed type:
    (bound_generic_struct_type decl=Swift.(file).Array
      (tuple_type num_elements=2
        (tuple_type_elt name=signal
          (enum_type decl=Signals.(file).Signals.Signal@/home/djones6/swift501/Kitura/.build/checkouts/BlueSignals/Sources/Signals/Signals.swift:38:14
            (parent=class_type decl=Signals.(file).Signals@/home/djones6/swift501/Kitura/.build/checkouts/BlueSignals/Sources/Signals/Signals.swift:31:14)))
        (tuple_type_elt name=action
          (function_type representation=c
            (input=function_params num_params=1
              (param
                (struct_type decl=Swift.(file).Int32)))
            (output=tuple_type num_elements=0)))))
    Stack dump:
    0.      Program arguments: /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift -frontend -c -primary-file /home/djones6/swift501/Kitura/.build/checkouts/BlueSignals/Sources/Signals/Signals.swift -emit-module-path /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/Signals.build/Signals~partial.swiftmodule -emit-module-doc-path /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/Signals.build/Signals~partial.swiftdoc -emit-dependencies-path /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/Signals.build/Signals.d -emit-reference-dependencies-path /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/Signals.build/Signals.swiftdeps -target x86_64-unknown-linux -disable-objc-interop -sdk / -I /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug -enable-testing -g -module-cache-path /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/ModuleCache -swift-version 5 -Onone -D SWIFT_PACKAGE -D DEBUG -color-diagnostics -enable-anonymous-context-mangled-names -parse-as-library -module-name Signals -o /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/Signals.build/Signals.swift.o -index-store-path /home/djones6/swift501/Kitura/.build/x86_64-unknown-linux/debug/index/store -index-system-modules
    1.      While emitting IR SIL function "@$s7SignalsAAC4trap7signalsySayAB6SignalO6signal_ys5Int32VXC6actiontG_tFZ".
     for 'trap(signals:)' (at /home/djones6/swift501/Kitura/.build/checkouts/BlueSignals/Sources/Signals/Signals.swift:123:9)
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x48cca44]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x48ca660]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x48cce68]
    /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7fdfe639c390]
    /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x38)[0x7fdfe4adb428]
    /lib/x86_64-linux-gnu/libc.so.6(abort+0x16a)[0x7fdfe4add02a]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x6e6689]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x6e6e5f]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x6e6b12]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x6de076]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x6ded3f]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x6f03c3]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x61c344]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x5865f8]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x586cd7]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x508e94]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x50451f]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x49fbdd]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fdfe4ac6830]
    /home/djones6/.swiftenv/versions/5.1-DEVELOPMENT-SNAPSHOT-2019-04-17-a/usr/bin/swift[0x49f759]
    

    This seems to relate to the @escaping attribute, and the various trap() function signatures. Specifically, there is one function that takes an array of (Signal,SigActionHandler) tuples, where the SigActionHandler is not explicitly marked as @escaping, however this is then passed to another trap() function where it is escaping.

    I couldn't find a syntax that allows you to mark the SigActionHandler that is embedded in the tuple type as escaping, and to be honest I'm not sure how this currently compiles - the fact that it blows up (rather than producing a proper error) on 5.1 suggests it might be a compiler issue, but I'm not really sure.

    opened by djones6 4
  • Cannot capture context in callback closure

    Cannot capture context in callback closure

    This code

    let a = {
       print("got here")
    }
    
    Signals.trap(signal: .user(Int(SIGWINCH))) { _ in
       a() 
    }
    

    generates this error message: A C function pointer cannot be formed from a closure that captures context

    I hoped that Signals would workaround this issue for me since I got the same message when calling the native signal trapping code i.e.

    signal(SIGWINCH, {_ in
       a()
    })
    

    maybe it would be nice if this was mentioned in the readme or some documentation on how to get around it.

    opened by potmo 3
  • Problem with signals.swift for upgraded swift version 4.2

    Problem with signals.swift for upgraded swift version 4.2

    There is an error in the file BlueSignals/Sources/Signals/Signals.swift... The Error is as follows: 111:36: error: converting non-escaping value to 'T' may allow it to escape sigAction.__sigaction_handler = unsafeBitCast(action, to: sigaction.__Unnamed_union___sigaction_handler.self) ^ error: terminated(1)

    opened by arkeo01 3
  • Could not compile via Carthage.

    Could not compile via Carthage.

    Probably this project have not shared scheme for carthage.

    $ carthage update --platform iOS BlueSignals
    *** Cloning BlueSignals
    *** Checking out BlueSignals at "1.0.10"
    *** xcodebuild output can be found in /var/folders/mj/5zhy3sh11h18pdwrb4v04b300000gn/T/carthage-xcodebuild.kMm90v.log
    *** Skipped building BlueSignals due to the error:
    Dependency "BlueSignals" has no shared framework schemes for any of the platforms: iOS
    
    If you believe this to be an error, please file an issue with the maintainers at https://github.com/IBM-Swift/BlueSignals/issues/new
    
    $ carthage update BlueSignals
    *** Fetching BlueSignals
    *** Checking out BlueSignals at "1.0.10"
    *** xcodebuild output can be found in /var/folders/mj/5zhy3sh11h18pdwrb4v04b300000gn/T/carthage-xcodebuild.x7e3Go.log
    *** Skipped building BlueSignals due to the error:
    Dependency "BlueSignals" has no shared framework schemes
    
    If you believe this to be an error, please file an issue with the maintainers at https://github.com/IBM-Swift/BlueSignals/issues/new
    
    opened by r-plus 3
  • Closures not working?

    Closures not working?

    I wonder about the example code which looks to me like it is using a closure which captured context. In my similar code I get the following error:

    error: a C function pointer cannot be formed from a closure that captures context

    This makes it pretty hard to do anything of value inside the signal handler.

    I "hacked" it with a global variable for my code but I wonder if there is a better solution for this problem or if I did something totally wrong?

    opened by oderwat 3
  • Swift 4 fix

    Swift 4 fix

    #2 Compiles on swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-11-a

    Description

    Motivation and Context

    How Has This Been Tested?

    Checklist:

    • [ ] I have submitted a CLA form
    • [ ] If applicable, I have updated the documentation accordingly.
    • [ ] If applicable, I have added tests to cover my changes.
    opened by quanvo87 2
  • Illegal instruction in Linux

    Illegal instruction in Linux

    This code works in macOS, but results in Illegal instruction in Linux (official Swift 4.2.1 Docker image):

    import Foundation
    import Signals
    
    let semaphore = DispatchSemaphore(value: 0)
    
    class Signaler {
        static func execute() {
            semaphore.signal()
        }
    }
    
    // crashes even if closure is empty
    Signals.trap(signals: [.int, .term]) { s in
        print("Trapped \(s)")
        Signaler.execute()
    }
    
    print("Now we wait")
    semaphore.wait()
    print("Bye!")
    

    However, classic signal works fine both in macOS and Linux:

    
    import Foundation
    
    let semaphore = DispatchSemaphore(value: 0)
    
    class Signaler {
        static func execute() {
            semaphore.signal()
        }
    }
    
    let trap: @convention(c) (Int32) -> Void = { s in
        print("Received signal \(s)")
        Signaler.execute()
    }
    
    signal(SIGINT, trap)
    signal(SIGTERM, trap)
    
    print("Now we wait")
    semaphore.wait()
    print("Bye!")
    
    opened by kirilltitov 1
  • Unable to capture signals in app delegate closure.

    Unable to capture signals in app delegate closure.

    I tried to crash my iOS 11 app by accessing out of bounds elements from an Array.

    In the app delegate's did finish launching with options, I declared like the below

    Signals.trap(signals: [.abrt, .alrm, .hup, .int, .kill, .pipe, .quit, .term]) { (signal) in
                print("Received signal \(signal)")
    }
    

    However, I am still not able to catch swift runtime exceptions. Pls guide.

    opened by cvamsi2 1
  • Add Swift 4 support

    Add Swift 4 support

    Description

    Motivation and Context

    How Has This Been Tested?

    Checklist:

    • [ ] I have submitted a CLA form
    • [ ] If applicable, I have updated the documentation accordingly.
    • [ ] If applicable, I have added tests to cover my changes.
    opened by quanvo87 1
Releases(2.0.1)
  • 2.0.0(Jul 15, 2021)

  • 1.0.21(Feb 27, 2018)

    Version 1.0

    Generic Cross Platform Signal Handler.

    Prerequisites

    Swift

    • Swift Open Source swift-4.0.0-RELEASE toolchain (Minimum REQUIRED for latest release)
    • Swift Open Source swift-5.0-RELEASE toolchain (Recommended)
    • Swift toolchain included in Xcode Version 10.2 (10E125) or higher.

    macOS

    • macOS 10.11.6 (El Capitan) or higher.
    • Xcode Version 9.0 (9A325) or higher using one of the above toolchains.
    • Xcode Version 10.2 (10E125) or higher using the included toolchain (Recommended).

    iOS

    • iOS 10.0 or higher
    • Xcode Version 9.0 (9A325) or higher using one of the above toolchains.
    • Xcode Version 10.2 (10E125) or higher using the included toolchain (Recommended).

    Linux

    • Ubuntu 16.04 (or 16.10 but only tested on 16.04).
    • One of the Swift Open Source toolchain listed above.

    Changes since 1.0.0

    • Updated for Swift 4.1.
    • Updated for Swift 4.2, added support for Travis CI.
    • Minor license update.
    • Updates for Xcode 10 to project.
    • Make Swift 4.2 the default compiler in project.
    • Added CocoaPod support.
    • Added Signals-Framework target to project to support Carthage. Issue #12.
    • Update CI with default build changed to Swift 4.2. PR #14.
    • Added CI support for building with Swift 5. PR #16.
    • Update CI support to use Swift 4.2.3. PR #18.
    • Updated to Swift 5.0. PR #19.
    • Add CI support for Xcode 11.
    • Update to Swift 5.1.
    Source code(tar.gz)
    Source code(zip)
  • 0.9.52(Aug 19, 2016)

    This release minimally requires use of the swift-3.1.1-RELEASE toolchain or the swift-4.0.0-RELEASE toolchain which is recommended.

    • Compatible with Xcode 9.0 (9A235) General Release or higher using one of the above toolchains.
    • Allow use on iOS, tvOS and watchOS as well as macOS.
    • Added new APIs to allow for ignoring a signal and restoring a signals default behavior.
    • Swift 4 fixes. See issue #2 and related PR #3.
    • Swift 4 Support.
    Source code(tar.gz)
    Source code(zip)
  • 0.8.0(Aug 16, 2016)

    This release requires use of the swift-DEVELOPMENT-SNAPSHOT-2016-08-15-a toolchain.

    • Compatible with Xcode 8 Beta 6 using the above toolchain.
    Source code(tar.gz)
    Source code(zip)
  • 0.7.1(Aug 6, 2016)

    This release requires use of the swift-DEVELOPMENT-SNAPSHOT-2016-08-04-a toolchain or the new swift-DEVELOPMENT-SNAPSHOT-2016-08-07-a toolchain.

    • Compatible with Xcode 8 Beta 4 using the above toolchain.
    Source code(tar.gz)
    Source code(zip)
  • 0.5.0(Jul 26, 2016)

    This release requires use of the new swift-DEVELOPMENT-SNAPSHOT-2016-07-25-a toolchain.

    Note: Due to inconsistencies in the implementation of Data on macOS and Linux, this release continues to use the NSData and NSMutableData types. Once these inconsistencies are rectified, the Data type will be adopted.

    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Jun 22, 2016)

  • 0.3.6(Apr 13, 2016)

  • 0.1.2(Mar 29, 2016)

Owner
Kitura
Kitura - Server Side framework written in Swift
Kitura
Cross-Platform, Protocol-Oriented Programming base library to complement the Swift Standard Library. (Pure Swift, Supports Linux)

SwiftFoundation Cross-Platform, Protocol-Oriented Programming base library to complement the Swift Standard Library. Goals Provide a cross-platform in

null 620 Oct 11, 2022
A cross-platform library of Swift utils to ease your iOS | macOS | watchOS | tvOS and Linux development.

Mechanica A library of Swift utils to ease your iOS, macOS, watchOS, tvOS and Linux development. Requirements Documentation Installation License Contr

Alessandro 28 Aug 28, 2022
SwiftExtensionKit - SwiftExtensionKit is to contain generic extension helpers for UIKit and Foundation

RichAppz PureSwiftExtensionKit SwiftExtensionKit is to contain generic extension

Rich Mucha 0 Jan 31, 2022
A Flutter plugin (platform channel with Swift) to get the current app name and also bring our app to the front.

window_to_front A new flutter plugin project. Getting Started This project is a starting point for a Flutter plug-in package, a specialized package th

Minas Giannekas 1 Nov 13, 2021
OTAtomics - Multi-platform Swift thread-safe atomics library

OTAtomics Multi-platform Swift thread-safe atomics library. The library has full

Steffan Andrews 2 Jul 8, 2022
The sample implementation of zip-archived document for a macOS AppKit platform.

The sample implementation of zip-archived document for a macOS AppKit platform. You can implement NSDocument-based I/O of archived document in your application like .sketch or .key.

usagimaru 4 Nov 12, 2022
EventBroadcaster is a lightweight event handler framework, written in swift for iOS, macOS, tvOS & watchOS applications.

EventBroadcaster is a lightweight event handler framework, written in swift for iOS, macOS, tvOS & watchOS applications.

Ali Samaiee 4 Oct 5, 2022
Arm64 architecture handler - It uses unicorn and libffi to run iOS arm64 binaries on x86_64 macOS

aah arm64 architecture handler. It uses unicorn and libffi to run iOS arm64 binaries on x86_64 macOS, with varying degrees of success. Most things wil

Jesús A. Álvarez 159 Dec 2, 2022
An easy to use UI component to help display a signal bar with an added customizable fill animation

TZSignalStrengthView for iOS Introduction TZSignalStrengthView is an easy to use UI component to help display a signal bar with an added customizable

TrianglZ LLC 22 May 14, 2022
WifiView Pod can animate wifi signal strength

WifiView WifiView is animateable UIView that can significantly enhance your users’ experiences and set your app apart from the rest of the pack. It is

Jawad Ali 12 Sep 27, 2022
Signal Handling with more normal Swift conventions

SignalHandler Adds support for signal handlers in a fully swifty way. Why this over raw signal handling or other packages. Signal handler functions ar

Braden Scothern 2 Apr 3, 2022
Easily generate cross platform Swift framework projects from the command line

SwiftPlate Easily generate cross platform Swift framework projects from the command line. SwiftPlate will generate Xcode projects for you in seconds,

John Sundell 1.8k Dec 27, 2022
Futures is a cross-platform framework for simplifying asynchronous programming, written in Swift.

Futures Futures is a cross-platform framework for simplifying asynchronous programming, written in Swift. It's lightweight, fast, and easy to understa

David Ask 60 Aug 11, 2022
Sage is a cross-platform chess library for Swift.

Sage is not a chess engine; it's a move generator. Hexe, on the other hand, is able to both generate moves and evaluate them.

Nikolai Vazquez 368 Dec 29, 2022
🎀 A simple cross-platform toolbar/custom input accessory view library for iOS & macOS.

Ribbon ?? A simple cross-platform toolbar/custom input accessory view library for iOS & macOS. Written in Swift. Looking for... A type-safe, XPC-avail

Chris Zielinski 294 Nov 28, 2022
Cross-platform static analyzer and linter for Swift.

Wiki • Installation • Usage • Features • Developers • License Tailor is a cross-platform static analysis and lint tool for source code written in Appl

Sleekbyte 1.4k Dec 19, 2022
Swift cross-platform crypto library using CommonCrypto/libcrypto

BlueCryptor Swift cross-platform crypto library derived from IDZSwiftCommonCrypto. IMPORTANT NOTE: This release is NOT entirely source code compatible

Kitura 183 Oct 15, 2022
🏹 Bow is a cross-platform library for Typed Functional Programming in Swift

Bow is a cross-platform library for Typed Functional Programming in Swift. Documentation All documentation and API reference is published in our websi

Bow 613 Dec 20, 2022
A cross-platform Reddit client built in SwiftUI

A cross-platform Reddit client created in SwiftUI. Get the Public Beta Note: This project is far from complete. It still lacks many features of your t

Carson Katri 1.2k Dec 25, 2022
Completed Project for Cross Platform Image Filter SwiftUI macOS & iOS App

Completed Project for Cross Platform Image Filter SwiftUI macOS & iOS App Follow the tutorial at alfianlosari.com Features Filter image using predefin

Alfian Losari 73 Dec 19, 2022