Sugar is a sweetener for your Cocoa implementations.
let appName = Application.name // CFBundleDisplayName : String
let appVersion = Application.version // CFBundleShortVersionString : String
let appExecutable = Application.executable // CFBundleExecutable : String
let appBundle = Application.bundle // CFBundleIdentifier : String
let appSchemes = Application.schemes // CFBundleURLSchemes : [String]
let mainAppScheme = Application.mainScheme // CFBundleURLSchemes.first : String?
Gain easy access to main bundle information.
let pixelSize = Screen.pixelSize // CGSize(width: screenWidth * scale, height: screenHeight * scale)
Get the actual pixel information of the device screen.
if !Simulator.isRunning {
// add device specific operations here
}
To easily exclude operations from when you as a developer runs the application in the simulator, not subscribing to push notification or running analytics operations etc.
Observe keyboard showing and hiding events, and handle it
let handler = BasicKeyboardHandler()
handler.show = { [weak self] height in
// move text fields up
}
handler.hide = { [weak self] in
// move text fields back to original position
}
keyboardObserver = KeyboardObserver(handler: handler)
Currently support
- BasicKeyboardHandler: basic UIView animation
- InsetKeyboardHandler: animate UIScrollView insets
- ConstraintKeyboardHandler: animate bottom layout constraint
- CustomKeyboardHandler: custom handling
let collectionView = UICollectionView()
collectionView.insert([1,2,3]) // ([Int] -> [NSIndexPaths]).{ insertRowsAtIndexPaths }
collectionView.reload([1,2,3]) // ([Int] -> [NSIndexPaths]).{ reloadRowsAtIndexPaths }
collectionView.delete([1,2,3]) // ([Int] -> [NSIndexPaths]).{ deleteRowsAtIndexPaths }
collectionView.reloadSection() // ([Int] -> [NSIndexSet]).{ reloadSections }
Enables you to easily run insert, update, delete, reload methods for a collection view by using Int
s instead
of NSIndexPath
and NSIndexSet
.
let tableView = UITableView()
tableView.insert([1,2,3]) // ([Int] -> [NSIndexPaths]).{ insertRowsAtIndexPaths }
tableView.reload([1,2,3]) // ([Int] -> [NSIndexPaths]).{ reloadRowsAtIndexPaths }
tableView.delete([1,2,3]) // ([Int] -> [NSIndexPaths]).{ deleteRowsAtIndexPaths }
tableView.reloadSection() // ([Int] -> [NSIndexSet]).{ reloadSections }
Enables you to easily run insert, update, delete, reload methods for a table view by using Int
s instead
of NSIndexPath
and NSIndexSet
.
let view = UIView.optimize
/*
clipsToBounds = true
layer.drawsAsynchronously = true
opaque = true
*/
image.original // imageWithRenderingMode(.AlwaysOriginal)
image.template // imageWithRenderingMode(.AlwaysTemplate)
let tableView = NSTableView()
tableView.insert([1,2,3]) // ([Int] -> [NSIndexPaths]).{ insertRowsAtIndexPaths }
tableView.reload([1,2,3]) // ([Int] -> [NSIndexPaths]).{ reloadRowsAtIndexPaths }
tableView.delete([1,2,3]) // ([Int] -> [NSIndexPaths]).{ deleteRowsAtIndexPaths }
tableView.reloadSection() // ([Int] -> [NSIndexSet]).{ reloadSections }
if date1 < date2 {
// do something
} else if date1 >= date2 {
// do something else
}
let _ = 5.day
let _ = 3.week
let view = UIView()
view.width = 200
view.height = 200
view.x = 25
view.y = 25
print(view.width) // prints 200
print(view.height) // prints 200
print(view.x) // prints 25
print(view.y) // prints 25
dispatch {
// dispatch in main queue
}
dispatch(queue: .Background) {
// dispatch in background queue
}
lazy var serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
dispatch(queue: .Custom(serialQueue)) {
// dispatch in a serial queue
}
Easy dispatching with grand central dispatch.
Support all the regular global queues: Main
, Interactive
, Initiated
, Utility
, Background
.
And .Custom()
for your own dispatch queues.
let string = localizedString("My Profile")
let formattedString = localizedString(key: "%d numbers", arguments: 10)
Swift access (pun intended) to NSLocalizedString
, you will get more valid auto completion
with this one, we promise.
var url = NSURL(string: "hyper.no")!
url ?= NSURL(string: "\\/http")
// url is equal to hyper.no
The ?=
only assigns values if the right is not nil.
let acceptable = 200..<300
if acceptable.contains(response.statusCode) {
// Status code is between 200 and 299.
}
if "[email protected]".isEmail() {
// Is email
}
let stringNumber = "1984"
if stringNumber.isNumber() {
// Is a number
}
if stringNumber.matches("^[0-9]*?$") {
// Is a number
}
struct Object: Queueable {
func process() -> Bool { return true }
}
let myQueue = [Object(), Object()]
myQueue.processQueue()
Make your own processing queue with ease, just make your object conform the Queueable
.
public protocol Queueable {
func process() -> Bool
}
let urlString = "https://hyper.no"
let url = urlString.url
Highly inspired by / borrowed from Alamofire's implementation of URLStringConvertible.
let string = "hyper/oslo"
string.length // 10
string.truncate(5) // hyper...
string.split(/) // ["hyper", oslo]
if string.isPresent {
// do something
}
if string.contains("hyper") {
// found hyper
}
var dirtyString = " hyper "
print(dirtyString.trim()) // prints "hyper"
Just some extra sugar on top of String
for getting the length, truncating, trimming or splitting a String
.
isPresent
is the opposite of isEmpty
.
contains
and be used to check if a string contains a word or pharse.
class Swizzled: NSObject {
override class func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
if self !== Swizzled.self {
return
}
dispatch_once(&Static.token) {
Swizzler.swizzle("method", cls: self)
}
}
dynamic func method() -> Bool {
return true
}
func swizzled_method() -> Bool {
return false
}
}
let object = Swizzled()
object.method() // false
Everyday we are swizzling, this use to be mundane, now it just Swiftling, we mean, super fast.
let UIView().then {
$0.backgroundColor = UIColor.blackColor()
}
This implementation is brought to you by @devxoul by his awesome Then repository.
public typealias JSONArray = [[String : AnyObject]]
public typealias JSONDictionary = [String : AnyObject]
if UITesting.isRunning {
// tests are running
} else {
// everything is fine, move along
}
To easily include or exclude operations for when you are running UI tests.
if UnitTesting.isRunning {
// running test
}
func testPerformance() {
let measurement = measure {
// run operation
}
}
Check if you are running UniTests and to measure performance.
Sugar is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'Sugar'
Sugar is also available through Carthage. To install just write into your Cartfile:
github "hyperoslo/Sugar"
Hyper Interaktiv AS, [email protected]
Sugar is available under the MIT license. See the LICENSE file for more info.