Contents

pawello2222/appliable

Appliable makes configuring objects easier and more convenient using closures.

Highlights <a name="highlights"></a>

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 <a name="installation"></a>

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 <a name="examples"></a>

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 <a name="conformance"></a>

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 <a name="license"></a>

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

Package Metadata

Repository: pawello2222/appliable

Default branch: main

README: README.md