File: README.md
Then
โจ Super sweet syntactic sugar for Swift initializers.
At a Glance
Initialize UILabel then set its properties.
let label = UILabel().then {
$0.textAlignment = .center
$0.textColor = .black
$0.text = "Hello, World!"
}This is equivalent to:
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 ofNSObjectsubclasses.swiftlet queue = OperationQueue().then { $0.maxConcurrentOperationCount = 1 }Want to use with your own types? Just make extensions.
swiftextension MyType: Then {} let instance = MyType().then { $0.really = "awesome!" }Use
with()when copying the value types.swiftlet newFrame = oldFrame.with { $0.size.width = 200 $0.size.height = 100 } newFrame.width // 200 newFrame.height // 100Use
do()to do something with less typing.swiftUserDefaults.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.
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:
rubypod 'Then'Using Swift Package Manager:
swiftimport 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
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