Then Documentation

Super sweet syntactic sugar for Swift initializers

4,396 stars Swift Swift 1 file ยท ~1,016 tokens #swift#syntactic-sugar
RAW Doc

File: README.md

Then


โœจ Super sweet syntactic sugar for Swift initializers.

At a Glance

Initialize UILabel then set its properties.

swift
let label = UILabel().then {
  $0.textAlignment = .center
  $0.textColor = .black
  $0.text = "Hello, World!"
}

This is equivalent to:

swift
let label: UILabel = {
  let label = UILabel()
  label.textAlignment = .center
  label.textColor = .black
  label.text = "Hello, World!"
  return label
}()

Tips and Tricks

  • You can use then() to all of NSObject subclasses.

    swift
    let queue = OperationQueue().then {
      $0.maxConcurrentOperationCount = 1
    }
  • Want to use with your own types? Just make extensions.

    swift
    extension MyType: Then {}
    
    let instance = MyType().then {
      $0.really = "awesome!"
    }
  • Use with() when copying the value types.

    swift
    let newFrame = oldFrame.with {
      $0.size.width = 200
      $0.size.height = 100
    }
    newFrame.width // 200
    newFrame.height // 100
  • Use do() to do something with less typing.

    swift
    UserDefaults.standard.do {
      $0.set("devxoul", forKey: "username")
      $0.set("[email protected]", forKey: "email")
      $0.synchronize()
    }

Real World Example

Here's an example usage in an UIViewController subclass.

swift
final class MyViewController: UIViewController {

  let titleLabel = UILabel().then {
    $0.textColor = .black
    $0.textAlignment = .center
  }

  let tableView = UITableView().then {
    $0.backgroundColor = .clear
    $0.separatorStyle = .none
    $0.register(MyCell.self, forCellReuseIdentifier: "myCell")
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addSubview(self.titleLabel)
    self.view.addSubview(self.tableView)
  }

}

Installation

  • Using CocoaPods:

    ruby
    pod 'Then'
  • Using Swift Package Manager:

    swift
    import PackageDescription
    
    let package = Package(
      name: "MyAwesomeApp",
      dependencies: [
        .Package(url: "https://github.com/devxoul/Then", majorVersion: 2),
      ]
    )

License

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


File: .github/workflows/ci.yml

name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: Test ${{ matrix.platform }}
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
include:
- platform: iOS
scheme: Then-iOS
destination: platform=iOS Simulator,name=iPhone 17,OS=latest
- platform: macOS
scheme: Then-macOS
destination: platform=macOS
- platform: tvOS
scheme: Then-tvOS
destination: platform=tvOS Simulator,name=Apple TV,OS=latest
- platform: watchOS
scheme: Then-watchOS
destination: platform=watchOS Simulator,name=Apple Watch Series 11 (46mm),OS=latest

text
steps:
  - name: Checkout
    uses: actions/checkout@v4

  - name: Install Tuist
    run: brew install tuist

  - name: Install Simulator Runtime
    if: matrix.platform == 'tvOS' || matrix.platform == 'watchOS'
    run: |
      xcrun simctl list > /dev/null
      sudo xcodebuild -downloadPlatform ${{ matrix.platform }}

  - name: Generate project
    run: tuist generate --no-open

  - name: Build and Test
    run: |
      xcodebuild clean build test \
        -project Then.xcodeproj \
        -scheme "${{ matrix.scheme }}" \
        -destination "${{ matrix.destination }}" \
        -enableCodeCoverage YES \
        CODE_SIGN_IDENTITY="" \
        CODE_SIGNING_REQUIRED=NO