Skip to content

A set of Swift helpers for iOS Application development

License

Notifications You must be signed in to change notification settings

dalu93/SwiftHelpSet

Repository files navigation

SwiftHelpSet

BuddyBuild

Set of Swift utilities for your iOS apps.

Swift 3 Compatibility

The Swift 3 compatibility is available from the version >= 1.4, the previous versions are only supported by Swift 2.x

Installation

pod 'SwiftHelpSet', '~> 1.0'

Networking

The networking layer is built over two different objects: the APIModule conforming object and the Resource. Conform to the APIModule protocol like below:

final class UserModule: APIModule {
    let baseAPIURL: String = "http://myserver.ext/api/user"

    func load<Object>(resource: Resource<Object>, completion: Completion<Object, NSError> -> ()) -> NSURLSession {

        // do the request, calling an API middleware
        // return the request
    }
}

Then, create your own resource

final class User {
    let id: String

    init(id: String) {
        self.id = id
    }
}

extension User {
    static var All: Resource<[User]> {
        return Resource(
            endpoint: Endpoint(
                path: "/",
                method: .GET,
                parameters: nil,
                headers: nil
            ),
            parseJSON: { json -> [User] in
                // parse the JSON
                // return the array of User
            }
        )
    }
}

Then call your APIModule as below

UserModule().load(User.All) { result in
    // switch over the Completion enum
}

That increase the testability of your code by helping you injecting fake APIModule instances.

Thanks to @ChrisEidhof for the Resource idea.

Bind

The help set allows you to create a more functional project by using the Bindable type. Declare your public variable as

var currentUser = Bindable<User>(user)

Then, from your class, you can listen changes to the variable currentUser by doing

objectReference.currentUser.bind = { user in
    // Do something when the currentUser changes
}

Foundation wrappers

Use Permission and Purchase to avoid the use of delegates for purchasing and for asking permissions. Use closures instead.

Use NotificationCenter to get a more powerful and smart wrapper around NSNotificationCenter

Use Each for a nice and easy implementation of NSTimer

Each(2).seconds.perform {
    // Do something
    return false    // true for stopping the timer, false for continuing
}

Each(1).minutes.perfor {
    // Do Something
}

Foundation extensions

Array

Use the method get(at index: Int) -> Element? on the array to get the element at index. Added also the method remove<T: Equatable>(object: T) -> Int? that removes an equatable object from the array and returns the position if it was found

String

New properties to simply get more info about the string: isEmail, isPhoneNumber, isBlank, lenght and even localized that returns the localized string for the key

Int

Easily check if an Int value is in a range by using isInRange(range: Range<Int>) -> Bool method.

Dictionary

Mix two dictionaries together by calling the +=, + operators

NSDate

No more .OrderedAscending or .OrderedSame to compare two NSDate instances. You can use the operators >, <, =

UIKit Wrappers

Use the SwiftyTableView, SwiftyScrollView and the SwiftyTextField to avoid the use of delegates as below

let tableView = SwiftyTableView().configureNumberOfSections {
    return 1
}.numberOfRowsPerSection { section in
    return 2
}.cellForIndexPath { indexPath, tableView in
    return UITableViewCell()
}

CABasicAnimation wrapper

Create your own animation easily. The wrapper allows you to create simple rotation animations only, but you can easily extend it.

let animation = BasicAnimation.rotationAnimation(on: .z, duration: 1).onStart {
    // do something at the start of the animation
}.onStop { finished in
    // do something at the end
    animation.remove()
}.add(to: layer)

Generic Table View Controller

Create your own table view controller easily, just passing a valid set of data

let genericTable = SwiftyGenericTableViewController<MyTableViewCell, User>()

genericTable.cellForModel { cell, model in
    // setup the cell
    return cell
}.onSelection { indexPath, model in
    // push or do something
}.dataSource = userArray

UIControl Extension

Define your action on UIControl trigger without using the ugly syntax addTarget(...).

let button = UIButton(frame: .zero)
button.bind(.TouchUpInside) {
    // Do something
}

UIBarButtonItem Extension

Define your UIBarButtonItem easily by providing a closure instead of a selector.

let item = UIBarButtonItem.itemWith(title: "BUTTON") {
    // do something on tap
}

UIGestureRecognizer extension

Easily define the UIGestureRecognizer by providing a closure instead of a selector

let tapRecognizer = UITapGestureRecognizer.recognizerPerforms {
    // Do something on tap
}.numberOfTapsRequired = 1

UIAlertController and UIAlertAction extension

Create easily your new UIAlertController as an alert by calling the method alertWith.

Add new actions all in once by calling add(_ actions: [UIAlertAction]) on your UIAlertController instance

Create new pre-defined UIAlertAction by using the static instance .Cancel

let alertController = UIAlertController.alertWith(message: "An error occured")

let cancelAction = UIAlertAction.Cancel()
let doneAction = UIAlertAction.Done()

alertController.addActions([
    doneAction,
    cancelAction
])

// present the controller

About

A set of Swift helpers for iOS Application development

Resources

License

Stars

Watchers

Forks

Packages

No packages published