Skip to content

cbkeur/ParksAndRecreation

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

75 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ParksAndRecreation

Various Swift playgrounds, for fun and for profit.

Index

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.

Debounce

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.

Ordered Dictionary

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.

Value Coding

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.

Swift 2 only

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.

About

Various Swift playgrounds, for fun and for profit.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 100.0%