Various Swift playgrounds, for fun and for profit.
Derived from @krzyzanowskim's blog post: use protocol extension to split any collection into a group of slices. Think flatten()
, but in reverse.
If you're hurting for Objective-C's MyClassType<SomeProtocolType> *
, try this on for size.
Use TextKit to perform custom truncation with high performance. Also an example of creating building a drop-in UILabel
backed by TextKit.
Use DispatchSource
to coalesce calls that shouldn't be called more than once per runloop iteration, like UI reconfiguration.
A fast recursive-descent parser for CSVs and similarly structured data inspired by Matt Gallagher.
Mathematical operators and idiomatic bridging for Core Graphics types.
An extension on UIViewController
providing a keyboardLayoutGuide
property. The layout guide normally mirrors the topLayoutGuide
and bottomLayoutGuide
, but automatically resizes to avoid the keyboard.
Requires iOS 9.0.
Line, paragraph, sentence, and word views for Swift.String
, providing alternatives to String.enumerateSubstringsInRange(_:options:_:)
.
Array(string.lines) // -> [Range<String.Index>]
Array(string.lines.substrings) // -> [String]
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.
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.
A simple glueing together of Swift.Dictionary
and Swift.String
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.
"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.
Emulating the calculation of UIView.readableContentGuide
.
Simple Swift bridging for NSRegularExpression
, as well as general patterns to go from String.UTF16View
and Range<String.UTF16Index>
to NSString
and NSRange
.
Conveniences for using Core Graphics types in UI programming, such as retina-friendly rounding and equation operators that account for floating point inaccuracy.
A simple bridge to bridges concrete value types into NSCoding
.
Showing off the simple power of Swift iterators by performing breadth-first travel through the trees created by UIView
, UIViewController
, and CALayer
.
Use protocol extension to achieve simpler Core Data, like MyManagedObject(context:)
.
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.
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.