Skip to content

Appliable makes configuring objects easier and more convenient using closures.

License

Notifications You must be signed in to change notification settings

pawello2222/Appliable

Repository files navigation

Appliable logo

Build Code coverage Language Supported platforms

Swift Package Manager Release version License

Appliable

Appliable makes configuring objects easier and more convenient using closures.

Table of Contents
  1. Highlights
  2. Installation
  3. Examples
  4. Conformance
  5. License

Highlights

let button = UIButton().apply {
    $0.isUserInteractionEnabled = false
}
UserDefaults.standard.apply {
    $0.set("Value 1", forKey: "Key 1")
    $0.set("Value 2", forKey: "Key 2")
    $0.set("Value 3", forKey: "Key 3")
}

Installation

Requirements

  • iOS 15.0+
  • macOS 12.0+
  • watchOS 8.0+
  • tvOS 15.0+

Swift Package Manager

Appliable is available as a Swift Package.

.package(url: "https://github.com/pawello2222/Appliable.git", .upToNextMajor(from: "1.0.0"))

Examples

Classes

let button = UIButton().apply {
    $0.isUserInteractionEnabled = false
}
let label = UILabel()

label.apply {
    $0.isUserInteractionEnabled = false
}

Structs

let calendar = Calendar(identifier: .gregorian).applying {
    $0.timeZone = .init(identifier: "UTC")!
    $0.locale = .init(identifier: "en_US_POSIX")
}
var calendar = Calendar(identifier: .gregorian)

calendar.apply {
    $0.timeZone = .init(identifier: "UTC")!
    $0.locale = .init(identifier: "en_US_POSIX")
}

Block operations

UserDefaults.standard.apply {
    $0.set("Value 1", forKey: "Key 1")
    $0.set("Value 2", forKey: "Key 2")
    $0.set("Value 3", forKey: "Key 3")
}

Arrays

var array = Array(repeating: Date(), count: 3)

array.applyEach {
    $0.addTimeInterval(1000)
}
let array1 = Array(repeating: Date(), count: 3)

let array2 = array1.applyingEach {
    $0.addTimeInterval(1000)
}
let label = UILabel()
let button = UIButton()

[label, button].applyEach {
    $0.isUserInteractionEnabled = false
}

let components = [UILabel(), UIButton()].applyEach {
    $0.isUserInteractionEnabled = false
}

Conformance

Built-in conformance

  1. Value types
  • Array
  • Calendar
  • Date
  • Dictionary
  • Set
  • URL
  • URLRequest
  1. Reference types
  • JSONDecoder
  • JSONEncoder
  • PropertyListDecoder
  • PropertyListEncoder
  1. All classes inheriting from NSObject

Custom conformance

extension Calendar: Appliable {} // value types

extension JSONDecoder: ObjectAppliable {} // reference types
struct Item: Appliable {
    var value: Int?
}

let item = Item().applying {
    $0.value = 1
}

License

Appliable is available under the MIT license. See the LICENSE file for more info.