Skip to content

Latest commit

 

History

History
250 lines (167 loc) · 5.44 KB

README.md

File metadata and controls

250 lines (167 loc) · 5.44 KB

SweeterSwift

Swift Version Build Status License CocoaPods Compatible
Platform PRs Welcome

Extensions and syntactic sugar to enrich the Swift standard library, iOS frameworks, and SwifterSwift.

Installation

CocoaPods:

pod 'SweeterSwift'

Swift Package Manager:

dependencies: [
    .package(url: "https://github.com/yonat/SweeterSwift", from: "1.2.6")
]

Usage

Auto Layout

Add button at the center of view:

view.addConstrainedSubview(button, constrain: .centerX, .centerY)

Put label over textField:

view.constrain(label, at: .leading, to: textField)
view.constrain(textField, at: .top, to: label, at: .bottom, diff: 8)

Add child view controller covering all but the bottom margin:

addConstrainedChild(vc, constrain: .bottomMargin, .top, .left, .right)

Bundle

App name with reasonable fallback to process name:

let appName = Bundle.main.name

App info string with name, version, and build number:

let appInfo = Bundle.main.infoString // "MyApp 1.0 #42"

Codable

Create object from a dictionary:

let decodableObject = MyDecodableClass(dictionary: aDictionary)

Export object to a dictionary:

let aDictionary = encodableObject.dictionary

DateFormatter

Create with format:

let dateFormatter = DateFormatter(format: "cccc, MMMM dd")

NotificationCenter

Post a local notification using NotificationCenter.default:

notify(notificationName, userInfo: infoDictionary)

Respond to a local notification from NotificationCenter.default:

observeNotification(notificationName, selector: #selector(someFunc))

NSAttributedString

Create from HTML:

let attributedString = NSAttributedString(htmlString: "Hello, <b>world</b>!")

Turn a substring into a link:

mutableAttributedString.link(anchorText: "Hello", url: "https://ootips.org")

NSManagedObjectContext

Dump contents to console for debugging:

managedObjectContext.printAllObjects()

Create a copy of the store for backup or for using later as initial setup:

managedObjectContext.backupStore()

String

Separate CamelCase into capitalized words:

let words = "winterIsComing".unCamelCased // "Winter Is Coming"

Change CamelCase into snake_case:

let key = "winterIsComing".camelToSnakeCased // "winter_is_coming"

Swift Standard Library

Index of current enum case in allCases:

let index = MyEnum.someCase.index

Unwrap collection, shorthand for compactMap { $0 }:

let nonOptionals = optionalsCollection.compact

Avoid retain cycles when passing a member function as an @escaping closure:

var closure = weak(self, in: MyClass.someFunction)

TimeInterval

Standard time intervals:

let myInterval: TimeInterval = .year + .month + .week + .day + .hour + .minute

UIApplication

Find the top-most view controller:

let topVC = UIApplication.topViewController()

Present modal over the top view controller:

UIApplication.present(modalVC)

UILabel / UITextView

Create a label with links by using a UITextView to auto-detect links and simulate UILabel appearance:

let hyperlinkedLabel = UITextView(simulatedLabelWithLinksInText: "More at https://ootips.org")

UIStackView

Remove an arranged subview from the view hierarchy, not just the stack arrangement:

stackView.removeArrangedSubviewCompletely(subview)

Remove all arranged subviews from the view hierarchy, not just the stack arrangement:

stackView.removeAllArrangedSubviewsCompletely()

UIView

Search the view hierarchy recursively for a subview that meets a condition:

let blueSubview = view.viewInHierarchy(where { $0.backgroundColor == .blue })

Search the view hierarchy recursively for a subview with a specific class:

let button = view.viewWithClass(UIButton.self)

Meta

@yonatsharon

https://github.com/yonat/SweeterSwift