Home

Awesome

DuctTape

<p align="center"> <a href="https://travis-ci.org/marty-suzuki/DuctTape"><img alt="CI Status" src="https://img.shields.io/travis/marty-suzuki/DuctTape.svg?style=flat"/></a> <a href="https://cocoapods.org/pods/DuctTape"><img alt="Pod" src="https://img.shields.io/cocoapods/v/DuctTape.svg?style=flat"/></a> <a href="https://github.com/Carthage/Carthage"><img alt="Carthage" src="https://img.shields.io/badge/Carthage-compatible-yellow.svg"/></a <a href="https://swift.org/package-manager"><img alt="SwiftPM" src="https://img.shields.io/badge/SwiftPM-compatible-green.svg"/></a> <br/> <a href="https://developer.apple.com/swift"><img alt="Swift5" src="https://img.shields.io/badge/language-Swift5-orange.svg"/></a> <a href="https://cocoapods.org/pods/DuctTape"><img alt="Platform" src="https://img.shields.io/cocoapods/p/DuctTape.svg?style=flat"/></a> <a href="https://cocoapods.org/pods/DuctTape"><img alt="License" src="https://img.shields.io/cocoapods/l/DuctTape.svg?style=flat"/></a> </p>

📦 KeyPath dynamicMemberLookup based syntax sugar for Swift.

let label: UILabel = UILabel().ductTape
    .numberOfLines(0)
    .textColor(.red)
    .text("Hello, World!!")

Above is same as below definition.

let label: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = .red
    label.text = "Hello, World!!"
    return label
}()

Usage

NSObject already has been compatible with DuctTape, so you can access .ductTape property like below.

let builder: Builder<UIView> = UIView().ductTape

If you access .ductTape, it returns Builder that provides setter of properties via KeyPath dynamicMemberLookup.

let view: UIView = UIView().ductTape
    .backgroundColor(.red)
    .translatesAutoresizingMaskIntoConstraints(false)

How to access methods

If you want to access methods of object which is building, func reinforce(_ handler: (Base) -> Void) Builder<Base> enable to access methods.

let collectionView: UICollectionView = UICollectionView().ductTape
    .backgroundColor(.red)
    .reinforce { collectionView in
        collectionView.register(UITableViewCell.self, forCellWithReuseIdentifier: "Cell")
    }

Builder has func reinforce<T1, ...>(_ t1: T1, ..., handler: (Base) -> Void) Builder<Base> methods. In additional usage, be able to access outside object with func reinforce if passing objects as arguments.

lazy var collectionView: UICollectionView = UICollectionView().ductTape
    .translatesAutoresizingMaskIntoConstraints(false)
    .reinforce(view) { collectionView, view in
        view.addSubview(collectionView)
        NSLayoutConstraint.activate([
            view.topAnchor.constraint(equalTo: collectionView.topAnchor),
            view.leadingAnchor.constraint(equalTo: collectionView.leadingAnchor),
            view.trailingAnchor.constraint(equalTo: collectionView.trailingAnchor),
            view.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor)
        ])
    }

How to use DuctTape with self-implemented classes

There are two ways to use DuctTape.

  1. Use DuctTapeCompatible
class Dog: DuctTapeCompatible {
    var name: String
}

let dog: Dog = Dog().ductTape
    .name("Copernicus")
  1. Use Builder directly
class Dog {
    var name: String
}

let dog: Dog = Builder(Dog())
    .name("Copernicus")

Sample Code

class ViewController: UIViewController {

    let flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        .ductTape
        .minimumLineSpacing(10)
        .minimumInteritemSpacing(10)
        .itemSize(CGSize(width: 100, height: 100))
        .scrollDirection(.vertical)

    lazy var collectionView: UICollectionView = UICollectionView(frame: .zero,
                                                                 collectionViewLayout: flowLayout)
        .ductTape
        .dataSource(self)
        .delegate(self)
        .translatesAutoresizingMaskIntoConstraints(false)
        .reinforce {
            $0.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
        }

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(collectionView)
        NSLayoutConstraint.activate([
            view.topAnchor.constraint(equalTo: collectionView.topAnchor),
            view.leadingAnchor.constraint(equalTo: collectionView.leadingAnchor),
            view.trailingAnchor.constraint(equalTo: collectionView.trailingAnchor),
            view.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor)
        ])
    }
}

Requirement

Installation

CocoaPods

DuctTape is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "DuctTape"

Carthage

If you’re using Carthage, simply add DuctTape to your Cartfile:

github "marty-suzuki/DuctTape"

Swift Package Manager

Simply add the following line to your Package.swift:

.package(url: "https://github.com/marty-suzuki/DuctTape.git", from: "version")

License

DuctTape is released under the MIT License.