ParksAndRecreation
Various Swift and SwiftUI tidbits, for fun and for profit.
Swift
Asynchronous Operations
Base classes for tracking work inside OperationQueue
that takes place outside of the queue, without causing a thread to hang by waiting. Includes an Operation
for wrapping URLSessionTask
.
Inspired by and lovingly nerd-sniped by @jaredsinclair.
Badge Formatter
A simple class for using Unicode to encircle some characters or single-digit numbers in the iOS system font, inspired by this tweet. Includes a gallery live view for demonstration.
Chunk Sequence
Derived from @krzyzanowskim's blog post: use a protocol extension to split any collection into a group of slices. Think flatten()
, but in reverse.
Combinatorial Parsers
A thought exercise strongly inspired by @khanlou (blog post here) and @pointfreeco for a more protocol-oriented, composable parsing flavored like Swift Combine.
Custom Truncation
Use TextKit to perform custom truncation with high performance. Also an example of creating building a drop-in UILabel
backed by TextKit.
Debounce
Use DispatchSource
to coalesce calls that shouldn't be called more than once per runloop iteration, like UI reconfiguration.
Delimited
A fast recursive-descent parser for CSVs and similarly structured data inspired by Matt Gallagher.
Deriving Scroll Views
Based on a technique used in the iOS 10 Music app, subclasses of UICollectionView
and UITableView
that derive their intrinsic content size and visible bounds from their content and context, respectively, when isScrollEnabled = false
. This is similar to behavior on UITextView
. It enables, for instance, putting three collection views in a stack view in a scroll view with low performance impact.
Geometry
Mathematical operators and idiomatic bridging for Core Graphics types.
HTML Reader
Extremely simple read-only HTML parser based on libxml2
with 100% test coverage.
Keyboard Layout Guide
An extension on UIViewController
providing a keyboardLayoutGuide
property. The layout guide normally mirrors the safe area, but automatically shrinks to avoid the keyboard. It also allows emulating the automatic content keyboard insets applied to UICollectionViewController
and UITableViewController
. It avoids the pitfalls of most keyboard avoidance implementations, like correctly syncing animations.
The Swift 3 version requires iOS 9.0.
Living Wallpapers
Create your own sun-, time-, or light/dark-based wallpaper for macOS Mojave.
Playground requires Swift 4.2 beta and macOS Mojave.
String Localization
Formatted localization using Swift string formatting. Introduces localize
with
a similar prototype to NSLocalizedString
:
func localize(text: LocalizableText, tableName: String? = default, bundle: NSBundle = default, value: String = default, comment: String)
What's a LocalizableText
? It's an intermediary type that deconstructs
interpolation segments for use with string formatting. But that's not important,
what's important is that it's literal convertible:
let filesLeft = 4
let filesTotal = 5
let labelText = localize("test-progress-\(filesLeft)-of-\(filesTotal)", comment: "Help text used for a positional description")
And in your Localizable.strings
, just like in Cocoa:
/* Help text used for a positional description */
"test-progress-%@-of-%@" = "%1$@ of %2$@ remaining.";
All placeholders should be %@
on the end of the key, and be represented
positionally, i.e., with %1$@
, %2$@
, and so on.
Target-Action Notifier
A helper for performing type-safe multicast callbacks. The result is a lot like
using UIControl
, but for weakly held objects and without unsafe selectors.
Heavily inspired by this blog post from @ole.
NSView
Layout Margins
Extending NSView
Auto Layout with conveniences from iOS, including
a view-level version of NSWindow.contentLayoutGuide
(think of it like you
would safe areas), directionalLayoutMargins
, layoutMarginsGuide
, and
readableContentGuide
.
Ordered Dictionary
A simple glueing-together of Dictionary
and Array
into an ordered, hashed data structure. Useful if your keys are indeed already Hashable
, but doesn't have great performance; insertion and removal tend towards the worst of both structures. If you have any alternative, prefer something B-Tree based instead.
Custom Size Classes
"Size classes are fine, but I can't customize them!" Yeah, you can! By inspecting what Mobile Safari does, you can do the same, using override trait collections.
Custom Readable Width
Emulating the calculation of UIView.readableContentGuide
.
Receding Navigation Title
Approximating multi-line large titles in navigation bars seen in News, Music, etc.
Regular Expressions
Simple Swift bridging for NSRegularExpression
, as well as general patterns to go from String.UTF16View
and Range<String.UTF16Index>
to NSString
and NSRange
.
Repeatable UUIDs
A Swift 5 implementation of the UUID version 5 algorithm, which is based on a SHA-1 hash of some input data. These can be useful as database primary keys identifying some model that has no identifier of its own. Like all UUIDs, version 5 hashed UUIDs still have an astronomically low chance of collision.
String Views
Line, paragraph, sentence, and word views for Swift.String
, providing a more idiomatic take on StringProtocol.getLineStart(_:end:contentsEnd:for:)
and StringProtocol.getParagraphStart(_:end:contentsEnd:for:)
as Swift collections.
Array(string.lines) // -> [Substring]
Floating Now Playing Bar
Experiment adding an accessory to UITabBarController
, like Now Playing in Music.​app.
- Drop-in UITabBarController with a
paletteViewController
property - Palette is forwarded appearance (i.e.,
viewWillAppear
) and trait collection events - Palette supports sizing through Auto Layout and
preferredContentSize
and animating changes to those - Can animate in, out, and between palette changes
- Detects and supports highlighting of palette background on tap
- Supports Interface Builder, 3D Touch, and modal view controllers
Thread with Function
Spawn and join with a pthread_t
returning a result from a Swift function, inspired by the Swift stdlib. See also Thread.init(block:)
from iOS 10 and up.
UI Geometry
Conveniences for using Core Graphics types in UI programming, such as retina-friendly rounding and equation operators that account for floating point inaccuracy.
View Recursion
Showing off the simple power of Swift iterators by performing breadth-first travel through the trees created by UIView
, UIViewController
, and CALayer
.
SwiftUI
Stickiness
Hiding and unhiding the top and bottoms bars of on scroll to match the various onboarding UIs in iOS (Settings, Apple Pay, Health, etc.)
Similar to Receding Navigation Title in UIKit.
Archive
Obsoleted in Swift 4
ConcretePlusProtocol
If you're hurting for Objective-C's MyClassType<SomeProtocolType> *
, try this on for size.
Obsoleted in Swift 4 by MyClass & SomeProtocol
syntax.
Value Coding
A simple bridge to bridges concrete value types into NSCoding
.
Obsoleted in Swift 4 by Codable
.
Obsoleted in Swift 3
BetterCoreDataInit
Use protocol extension to achieve simpler Core Data, like MyManagedObject(context:)
.
Data
An idiomatic Data<T>
, representing any buffer (contiguous or discontiguous) of
numeric elements. Part NSData
, part dispatch_data_t
, Data
is useful for
low-level byte-based APIs in Swift, such as crypto and string parsing.
Create one with an array:
let data = Data<UInt8>(array: [ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21 ])
And enumerate through it in constant time:
for byte in data {
...
}
Made with lots of help from @a2.
Fixing dispatch_block_t
Even though it's been fixed in 2.1, Swift 2.0 has a rather ugly bug with wrapped dispatch_block_t
types. Fix it with a C few tricks and a rational DispatchBlock
type.