# Technical Documentation: devxoul/Then

> ℹ️ **Provenance:** In-Tree Documentation (2 Chapters) · [CodeWiki Reference](https://codewiki.google/github.com/devxoul/Then) · Recency: Active (< 180 days)

## File: README.md

# Then


[](https://cocoapods.org/pods/Then)
[](https://github.com/devxoul/Then/actions/workflows/ci.yml)

✨ 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("devxoul@gmail.com", 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](https://cocoapods.org)**:

    ```ruby
    pod 'Then'
    ```

- **Using [Swift Package Manager](https://swift.org/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](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

    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

--- METRICS ---
- Files Extracted: 2
- Estimated Token Budget: ~1021 tokens
- Recency Window: Active (< 180 days)
- Canonical Reference: https://codewiki.google/github.com/devxoul/Then
