Go to file
Yonat Sharon b6e7c584ad
Create FUNDING.yml
2022-07-31 06:41:39 +03:00
.github Create FUNDING.yml 2022-07-31 06:41:39 +03:00
Source fix crash on iOS 14 when using Xcode 13.3 2022-04-07 15:43:33 +03:00
SweeterSwift add test for conflict between Decodable.init(dictionary:) from SweeterSwift and identical internal init 2022-06-23 13:50:53 +03:00
.gitignore initial 2019-07-13 15:57:41 +03:00
CHANGELOG.md bump version to 1.2.1 2022-04-07 15:43:49 +03:00
LICENSE.txt initial 2019-07-13 15:57:41 +03:00
Package.swift add tests target 2022-04-07 13:37:22 +03:00
README.md bump version to 1.2.1 2022-04-07 15:43:49 +03:00
SweeterSwift.podspec bump version to 1.2.1 2022-04-07 15:43:49 +03:00

README.md

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.1")
]

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