LambdaKit
Closure可以让代码更清晰易读。您可以编写独立的小代码片段,而不用在应用中分散逻辑,Cocoa正在缓慢地向block/closure方法转型,但许多Cocoa库(如UIKit)仍不支持Closure。LambdaKit希望通过移除一些对使用Closing编码的令人烦恼的限制来促进这种编程方式。
要求
- iOS 8.0+
- Xcode 7.3
安装
CocoaPods是Cocoa项目的依赖管理器。
CocoaPods 0.36增加了对Swift和内嵌框架的支持。您可以使用以下命令来安装它:
$ gem install cocoapods
要使用CocoaPods将LambdaKit集成到您的Xcode项目,请在您的Podfile中指定它:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'LambdaKit'
然后,运行以下命令:
$ pod install
使用
UIControl
为UIControl提供定义控制事件处理的闭包。
let button = UIButton.buttonWithType(.System) as! UIButton
button.addEventHandler(forControlEvents: .TouchUpInside) { button in
println("Button touched!!! \(button)")
}
UIGestureRecognizer
为UIGestureRecognizer提供闭包功能。
let doubleTap = UITapGestureRecognizer { gesture, state in
println("Double tap!")
}
doubleTap.numberOfTapsRequired = 2
self.addGestureRecognizer(doubleTap)
WKWebView
为WKWebView导航和UI代理提供闭包支持。
let webView = WKWebView()
webView.didStartProvisionalNavigation = { webview in
print("didStartProvisionalNavigation: \(webview)")
}
webView.didFinish = { webview in
print("didFinish \(webview)")
}
webView.didFailProvisionalNavigation = { webview, error in
print("didFailProvisionalNavigation with error \(error)")
}
webView.didFail = { webView, error in
print("didFail with error \(error)")
}
webView.didReceiveChallenge = { webView, challenge, completion in
completion(.useCredential, URLCredential(trust: ...))
}
webView.shouldPreviewElement = { webview, elementInfo in
print("shouldPreviewElement \(webview)")
return true
}
UIImagePickerController
带有闭包回调的UIImagePickerController。
let picker = UIImagePickerController()
picker.didCancel = { picker in
println("DID CANCEL! \(picker)")
}
picker.didFinishPickingMedia = { picker, media in
println("Media: \(media[UIImagePickerControllerEditedImage])")
}
self.presentViewController(picker, animated: true, completion: nil)
NSObject
为键值观察提供闭包包装。
在Mac OS X Panther中,Apple引入了一个名为"键值观察"的API。它实现了一个观察者模式,其中对象将通知观察者状态的任何更改。NSNotification是这个设计风格的简单形式;然而,KVO(键值观察)允许观察键值状态的任何变化。但是,键值观察的API有缺陷、难看且冗长。
与LambdaKit中的大多数其他闭包功能一样,观察节省了大量的代码和潜在的错误。
警告:使用闭包和 Cocoa 观察者互不干扰。这意味着你既不应该使用此包装添加“传统”的观察者然后移除它,也不能添加闭包观察者然后使用 Cocoa 方法移除它。
self.observeKeyPath("testing", options: .New | .Old) { newValue, oldValue in
println("Property was: \(oldValue), now is: \(newValue)")
}
MFMailComposeViewController
采用闭包回调的 MFMailComposeViewController。
注意:在设置完成处理程序时,你不再需要处理控制器视图的消失。
let composeViewController = MFMailComposeViewController { viewController, result, type in println("Done") }
composerViewController.setSubject("Test")
MFMessageComposeViewController
采用闭包回调的 MFMessageComposeViewController。
注意:在设置完成处理程序时,你不再需要处理控制器视图的消失。
let composeViewController = MFMessageComposeViewController { viewController, result in println("Done") }
composerViewController.body = "test sms"
UIBarButtonItem
UIBarButtonItem 闭包事件初始化。
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style: .Bordered) { btn in
println("Button touched!!!!!! \(btn)")
}
CADisplayLink
CADisplayLink 闭包实现。
CADisplayLink.runFor(5.0) { progress in
println("Awesome \(progress * 100)%")
}
CLLocationManager
CLLocationManager 代理的闭包实现。
注意:在使用 startUpdatingLocation(handler) 时,你需要使用对应的 stopUpdatingLocationHandler,否则会导致内存泄漏。
示例
let locationManager = CLLocationManager()
locationManager.starUpdatingLocation { location in
println("Location: \(location)")
}
locationManager.stopUpdatingLocationHandler()
UIActivityItemProvider
常用 UIActivityItemProvider 的闭包实现。
let urlProvider = ActivityURLProvider { _, activityType in
return URL(string: "https://example.com")
}
let activityViewController = UIActivityViewController(activityItems: [urlProvider], applicationActivities: nil)
警告:您不能同时使用闭包和设置代理。设置代理将阻止闭包被调用,设置闭包将覆盖代理属性。
作者
马丁·孔特·麦克唐纳尔 @fz