Sugar
Sugar 是一款用于您的 Cocoa 实现的糖分。
目录
iOS
应用程序
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?
轻松获取主包信息。
屏幕
let pixelSize = Screen.pixelSize // CGSize(width: screenWidth * scale, height: screenHeight * scale)
获取设备屏幕的实际像素信息。
模拟器
if !Simulator.isRunning {
// add device specific operations here
}
为开发者从模拟器中运行应用时,轻松排除操作,如不订阅推送通知或运行分析操作等。
键盘观察器
观察键盘显示和隐藏事件,并进行处理
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)
目前支持
- BasicKeyboardHandler:基本的UIView动画
- InsetKeyboardHandler:animate UIScrollView缩进
- ConstraintKeyboardHandler:animate底部布局约束
- CustomKeyboardHandler:自定义处理
UIView
.optimize()let view = UIView.optimize
/*
clipsToBounds = true
layer.drawsAsynchronously = true
opaque = true
*/
UIImage
渲染模式image.original // imageWithRenderingMode(.AlwaysOriginal)
image.template // imageWithRenderingMode(.AlwaysTemplate)
共享
序列类型let first: Int? = items.findFirst({ $0 > 10 })
日期
比较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
}
let view = UIView.optimize
/*
clipsToBounds = true
layer.drawsAsynchronously = true
opaque = true
*/
image.original // imageWithRenderingMode(.AlwaysOriginal)
image.template // imageWithRenderingMode(.AlwaysTemplate)
let first: Int? = items.findFirst({ $0 > 10 })
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
}
使用主中心调度轻松进行调度。支持所有常规全局队列:`Main`、`Interactive`、`Initiated`、`Utility`、`Background`。还有 `.Custom()` 供你自定义调度队列。
本地化
let string = localizedString("My Profile")
let formattedString = localizedString(key: "%d numbers", arguments: 10)
Swift 快速访问 (pun intended) 到 `NSLocalizedString`,我们保证将有更多的有效自动完成。
Once
let once = Once()
once.run {
// do something
}
once.run {
// no effect
}
运算符
var url = NSURL(string: "hyper.no")!
url ?= NSURL(string: "\\/http")
// url is equal to hyper.no
?=
运算符仅在右侧非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()
轻松创建自己的处理队列,只需让您的对象符合 Queueable
。
public protocol Queueable {
func process() -> Bool
}
URLStringConvertible
let urlString = "https://hyper.no"
let url = urlString.url
核心基础
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"
在 `String
` 上添加了一些额外的糖层,用于获取长度、截断、修剪或分割字符串。
isPresent
是 isEmpty
的反义词。
contains
可以用来检查字符串是否包含单词或短语。
Swizzler
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
我们每天都在进行方法交换,这曾经很普通,现在是 Swiftling,也就是说,非常快。
Then
let UIView().then {
$0.backgroundColor = UIColor.blackColor()
}
此实现由 @devxoul 通过他的出色 Then 仓库提供。
类型别名
public typealias JSONArray = [[String : AnyObject]]
public typealias JSONDictionary = [String : AnyObject]
UI测试
if UITesting.isRunning {
// tests are running
} else {
// everything is fine, move along
}
当运行UI测试时,轻松包含或排除操作。
单元测试
if UnitTesting.isRunning {
// running test
}
func testPerformance() {
let measurement = measure {
// run operation
}
}
检查是否正在运行单元测试并测量性能。
安装
Sugar 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'Sugar'
Sugar 同样通过 Carthage 提供。要安装,只需在 Cartfile 中写入
github "hyperoslo/Sugar"
Sugar 还通过 Swift 包管理器 提供。
- iOS: 打开 Xcode,文件->Swift Packages,搜索输入 https://github.com/hyperoslo/Sugar.git,然后选择下一个主要版本 5.0.1 < .
- 或添加依赖项到您的
Package.swift
.package(url: "https://github.com/hyperoslo/Sugar.git", .upToNextMajor(from: "5.0.1")),
作者
Hyper Interaktiv AS,[email protected]
许可协议
糖 在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。