Nest.swift 2.0.0.1

Nest.swift 2.0.0.1

测试已测试
语言 SwiftSwift
许可证 MIT
发布上次发布2015 年 7 月
SPM支持 SPM

WeZZard 维护。



Nest.swift 2.0.0.1

  • WeZZard

Nest 是一个库,它使 Foundation 和 Swift 的工作更加无缝,并提供了一些缺失的辅助函数和实用工具。

如何开始

通过 Cocoa Pods 安装

  • pod "Nest.swift"
  • import Nest 添加到您的 Swift 源文件中

手动安装

  • 下载或克隆项目
  • 将 Nest 的 Xcode 项目文件拖到您的 workspace 中
  • 如果您正在构建应用程序,请将 Nest 添加到您的目标的一般页面中的“嵌入二进制文件”字段。如果您正在构建框架,请在您的目标的一般页面中将 Nest 添加到“链接框架和库”字段。
  • import Nest 添加到您的 Swift 源文件中
  • 您可能需要以相同的方式手动将依赖项添加到您的项目文件中。
  • 享受您的 Nest 之旅

内容

NSProtocolInterceptor

情境

这个类是从我撰写的一个 Stack Overflow 答案中诞生的: 在子类中拦截 Objective-C 代理消息。但由于原始代码是用 Objective-C 编写的,Swift 的代码级安全性使得将任何类型的对象分配给指针成为不可能的,因此我重新用 Swift 编写了它,并在 Swift 中添加了一些额外的代码,以便它可以现在工作。

介绍

NSProtocolInterceptor 是一个对象,它将自己伪装成初始化时分配的协议类型,并在中间人拦截消息,如果它可以响应,它将发送到接收器。

示例

初始化

  • NSProtocolInterceptor(aProtocol: 协议)

  • NSProtocolInterceptor(protocols: [协议])

  • NSProtocolInterceptor(protocols: 协议 ...)

在子类中拦截消息

  • MyScrollView.swift
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的桥接头声明 UIScrollViewdelegate 属性为 unowned(unsafe),并且未将 UIScrollViewDelegate 标记为仅协议的类,我们目前无法在Swift中重写 delegate 属性。所以让我们在Objective-C中重写它。

  • MyScrollView+OverrideDelegate.h
@import UIKit;

#import "ProductModuleName-Swift.h"

@interface MyScrollView (OverrideDelegate)
@end
  • MyScrollView+OverrideDelegate.m
@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

情况

复用是优化程序性能的一种常见方式。这个类旨在使复用更加简单。

简介

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

NSDate与Comparable的兼容性

背景

为了避免使用compare:函数比较两个NSDate对象,我使NSDate符合Comparable

示例

let now = NSDate()
let tenSecondsBefore = now.dateByAddingTimeInterval(-10)

if now > tenSecondsBefore {
    println("Now is later than ten seconds before")
}

在NSString中搜索给定字符串的所有出现

背景

在不使用正则表达式的情况下,在NSString中搜索给定字符串的所有出现。

示例

使用当前区域搜索整个字符串中的字符

let aString = "This is a string"
let aStringInNSString = aString as NSString

let occurrences = aStringInNSString.rangesOfString("s", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)

NSRangeMake

示例

let anNSRange = NSRangeMake(location: 0, length: 10)

使用CoreData时NSError的初始化便捷性

示例

组合两个错误

let anError = NSError(error: anError, anotherError: anOtherError)

将指针中的错误与另一个错误组合

let anError = NSError(errorPointer:anErrorPointer, secondError: secondError)

组合一个错误数组

let anError = NSError(errors: errors)

依赖关系