Nest 是一个库,它使 Foundation 和 Swift 的工作更加无缝,并提供了一些缺失的辅助函数和实用工具。
pod "Nest.swift"
import Nest
添加到您的 Swift 源文件中import Nest
添加到您的 Swift 源文件中Nest
之旅这个类是从我撰写的一个 Stack Overflow 答案中诞生的: 在子类中拦截 Objective-C 代理消息。但由于原始代码是用 Objective-C 编写的,Swift 的代码级安全性使得将任何类型的对象分配给指针成为不可能的,因此我重新用 Swift 编写了它,并在 Swift 中添加了一些额外的代码,以便它可以现在工作。
NSProtocolInterceptor
是一个对象,它将自己伪装成初始化时分配的协议类型,并在中间人拦截消息,如果它可以响应,它将发送到接收器。
NSProtocolInterceptor(aProtocol: 协议
)
NSProtocolInterceptor(protocols: [协议]
)
NSProtocolInterceptor(protocols: 协议 ...
)
class MyScrollView: UIScrollView, UIScrollViewDelegate {
let delegateInterceptor: NSProtocolInterceptor
func scrollViewDidScroll(scrollView: UIScrollView) {
if self.delegate?.respondsToSelector("scrollViewDidScroll:") == true {
self.delegate?.scrollViewDidScroll?(scrollView)
}
}
required init(coder aDecoder: NSCoder) {
delegateInterceptor = NSProtocolInterceptor(aProtocol: UIScrollViewDelegate.self)
super.init(coder: aDecoder)
delegateInterceptor.middleMan = self
super.delegate = delegateInterceptor as? UIScrollViewDelegate
}
override init(frame: CGRect) {
delegateInterceptor = NSProtocolInterceptor(aProtocol: UIScrollViewDelegate.self)
super.init(frame: frame)
delegateInterceptor.middleMan = self
super.delegate = delegateInterceptor as? UIScrollViewDelegate
}
}
由于UIKit的桥接头声明 UIScrollView
的 delegate
属性为 unowned(unsafe)
,并且未将 UIScrollViewDelegate
标记为仅协议的类,我们目前无法在Swift中重写 delegate
属性。所以让我们在Objective-C中重写它。
@import UIKit;
#import "ProductModuleName-Swift.h"
@interface MyScrollView (OverrideDelegate)
@end
@import Nest;
#import "MyScrollView+OverrideDelegate.h"
@implementation MyScrollView (OverrideDelegate)
- (id <UIScrollViewDelegate>)delegate {
return (id <UIScrollViewDelegate>)self.delegateInterceptor.receiver;
}
- (void)setDelegate:(id <UIScrollViewDelegate>)delegate {
super.delegate = nil;
self.delegateInterceptor.receiver = delegate;
super.delegate = (id <UIScrollViewDelegate>)self.delegateInterceptor;
}
@end
复用是优化程序性能的一种常见方式。这个类旨在使复用更加简单。
NSReuseCenter
为符合 NSReusable
协议的对象提供了一种入队和出队机制。
let theReuseCenter = NSReuseCenter<AParticularReusable>()
theReuseCenter.enqueueUnused(anUnusedObject)
theReuseCenter.dequeueReusableWithReuseIdentifier(aReuseIdentifier)
theReuseCenter.reusableForReuseIdentifier(aReuseIdentifier)
可能曾经遇到过这样的一种情况,你想要在一个协议约束的集合中找到一个 NSObjectProtocol
符合的对象,但Swift认为你的 NSObjectProtocol
符合对象并未实现 Equatable
协议,这使你无法使用Swift标准库中的 find
函数。这些函数集合假定任何 NSObjectProtocol
符合对象都清楚地了解 isEqual:
函数,并使用该函数来评估对象之间的相等性。
检查 一个 NSObjectProtocol
符合对象是否包含在 NSObjectProtocol
符合对象的集合中。
NSContains<C
where C
: CollectionType
, C.Generator.Element
: NSObjectProtocol
>(domain: C
, element: C.Generator.Element
) -> Bool
查找 一个 NSObjectProtocol
符合对象在 NSObjectProtocol
符合对象的集合中的索引。
NSFind<C
: CollectionType
where C.Generator.Element
: NSObjectProtocol
>(domain: C
, value: C.Generator.Element
) -> C.Index?
计算 在两个 NSObjectProtocol
符合对象的集合中的交叉对象。
NSIntersected<C
: ExtensibleCollectionType
where C.Generator.Element
: NSObjectProtocol
>(collectionA: C
, collectionB: C
) -> C
评估 两个 NSObjectProtocol
符合对象的集合之间的差异。
NSDiff<Seq
: SequenceType
where Seq.Generator.Element
: NSObjectProtocol
>(from fromSequence: Seq?
, to toSequence: Seq?
, differences: SequenceDifference
, unchangedComparator: ((Seq.Generator.Element, Seq.Generator.Element)->Bool)
= default, usingClosure changesHandler: (change: SequenceDifference, fromElement: (index: Int, element: Seq.Generator.Element)?, toElement: (index: Int, element: Seq.Generator.Element)?) -> Void
)
从Objective-C协议合规对象集合中删除一个Objective-C协议合规对象。
NSRemove<C
: RangeReplaceableCollectionType
where C.Generator.Element
: NSObjectProtocol
, C.Index
: protocol<Comparable, BidirectionalIndexType>
> (inout collection: C
, elements: C
) -> C
检查一个选择器是否属于某个协议。
sel_belongsToProtocol(aSelector: Selector
, aProtocol: Protocol
) -> Bool
Swizzle 给定类的一个选择器与实现。原始实现将通过与给定前缀及其原始选择器组成的选择器连接。
class_swizzleClass(aClass: AnyClass
, selector: Selector
, withImplementation: IMP
, selectorPrefix: String
) -> Bool
为了避免使用compare:
函数比较两个NSDate
对象,我使NSDate
符合Comparable
。
let now = NSDate()
let tenSecondsBefore = now.dateByAddingTimeInterval(-10)
if now > tenSecondsBefore {
println("Now is later than ten seconds before")
}
在不使用正则表达式的情况下,在NSString
中搜索给定字符串的所有出现。
let aString = "This is a string"
let aStringInNSString = aString as NSString
let occurrences = aStringInNSString.rangesOfString("s", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)
let anNSRange = NSRangeMake(location: 0, length: 10)
let anError = NSError(error: anError, anotherError: anOtherError)
let anError = NSError(errorPointer:anErrorPointer, secondError: secondError)
let anError = NSError(errors: errors)