Swift 常用开源项目说明

这部分内容其实已经很早就有人总结过,而且内容相当丰富。附上 github 地址:

awesome-swift

其实这个系列的还有很多,极大的方便了开发者寻找自己需要的基础控件和工具。

本着记录和分享的态度,已下对本人觉得有必要深入了解,并可以使用在 swift 上的开源项目进行罗列。

Dollar

github 地址: Dollar
推荐理由:操作数组的神器
简介:正如推荐的中所说,Dollar 是一个用来处理数组的工具集。

Dollar 很强大,她优雅的为我们提供了解决数组,字典等对象的基本操作。比如将数组划分成若干个子集,如果我们自己动手做,那少不了for循环加各种判断。但使用 Dollar 一行代码就能搞定。具体接口可以去 github 上查阅。

主要包括以下中对象的操作

  • Array
  • Dictionary
  • Object
  • Function
  • Chaining

SwiftyJSON

github 地址:SwiftyJSON
推荐理由: 用过,因为是swift编写的所以性能和理解上不存在问题
简介:是一个使用简单的处理 json 格式数据的工具

详细的介绍和使用方法可参看 SwiftyJSON DOC 。这里多说一句,SwiftyJSON 的主要目的简化 JSON 数据的解析过程。但建模型的时候还是需要依次获取 JSON 里的数据赋值给模型。当 JSON 数据参数很多的时候,编写起来会费劲。所以推荐与 ObjectMapper 一起使用。

ObjectMapper

github 地址:ObjectMapper
推荐理由: 用过,很方便而且直观。只需要在 model 中引用 ObjectMapper 用法即可
简介:让数据模型的构造如此简单

可能你会有疑问,竟然 ObjectMapper 能将 jsonString 直接转换成 model 那为什么还要使用上面的 SwiftyJSON . 这是因为我们的 JSON 数据中并不是所有内容都是我们需要的,我们可以通过 SwiftyJSON 先获取我们需要的数据块,然后在通过 ObjectMapper 获取 model。

Alamofire

github 地址:Alamofire
推荐理由:用过,OC 上广为流传的网络请求框架 AFNetworking 已经有20000+的star,但对于 swift 开发,个人理解还是要用 swift 的框架的工具比较合适。并且她有多个扩展的工具集,配合使用功能还是很强大的。
简介:无

Alamofire 扩展

  • AlamofireImage -- AlamofireImage is an image component library for Alamofire。(用过,使用简单,加载性能也还不错,只是没有深入了解其缓存数据的问题)
  • AlamofireNetworkActivityIndicator -- Controls the visibility of the network activity indicator on iOS using Alamofire
  • AlamofireObjectMapper -- An extension to Alamofire which automatically converts JSON response data into swift objects using ObjectMapper.(个人觉得不是很好用,除非网络返回的 JSON 数据格式单一,不需要任何截取操作)

DEMO:

// HttpManager.swift
// 使用Alamfire网络请求
// success: (json: JSON)->Void, errors: ()->Void 这两个闭包用来处理成功和错误的操作
// url:访问地址;parameters;参数
func requestForGetWithParameters(url: String, parameters params: [String:String], success: (json: JSON)->Void, errors: ()->Void) {
        
        // 使用 Alamofire 进行网络数据请求
        Alamofire.request(.GET, url, parameters: params).responseJSON {response in
            switch response.result {
            case .Success:
                if let value = response.result.value {
                    let json = JSON(value)
                    NSLog("JSON: \(json["result"])")
                    guard let result = json["result"].string where result == "SUCCESS" else {
                        errors()
                        return
                    }
                    success(json: json)
                }
                break
            case .Failure(let error):
                NSLog("error,failure: \(error)")
                errors()
                break
            }
        }
    }
    
  
 // ViewController.swift 
 // 获取JSON数据,截取需要的数据,生成model
 func onLoadMore() {
        HttpManager.sharedInstance.requestForGetWithPageIndex(
            URL_HOME_ONE,
            pageIndex: pageIndex,
            success: { json in
                // 这里很重要,是用来SwiftyJSON和ObjectMapper生成model
                let home = Mapper().map(json["hpEntity"].rawValue)
                self.apps.append(home!)
                HomePageViewCell.layoutHeight(home!) //计算cell内容高度
                self.pageIndex++
                self.htv!.tableView?.reloadData()
            },
            error: {
                ProgressHUD.showWarningWithStatus("没有更多内容可加载!")
                // 滑动tableview到最后一个cell
                self.htv!.tableView?.selectRowAtIndexPath(NSIndexPath(forRow: 9, inSection: 0), animated: false, scrollPosition: UITableViewScrollPosition.Bottom)
        })
    }

就此,网络获取的请求、json 数据处理,model生成就完成了。其实还是挺方便的。

SnapKit

github 地址:SnapKit
简介:SnapKit is a DSL to make Auto Layout easy。
doc:http://snapkit.io/docs/

因为没有详细研究过,所以不好多说。只简单谈一谈对Auto Layout的理解。Auto Layout 是 Apple 专门用来配合 IB(Inerface Builder) 解决多拼适配问题的(这样说当然也有不合适的地方)。通过 IB 设置控件之间的约束,使控件在不同设备上相对距离和大小一致。然而不管是通过 IB 还是代码实现这些约束,都不是一件容易的事情。尤其代码实现,对经验不足的人来说,简直是地狱。SnapKit 则对代码实现约束做了封装,对布局的理解简单化,也更直观。
SnapKit 虽然是利器,但用不好就会变凶器。试想一下如果布局复杂,那用代码实现会很恐怖。看过很多blog后,我有新的理解。那就是对布局模块化,简单化。尽量使用 IB 进行布局,对复杂的布局可以尝试 Container View 进行分割。SnapKit 则是用来微调和解决大视图模块之间无法用 IB 产生约束的情况。

Demo:

import SnapKit

class MyViewController: UIViewController {

    lazy var box = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(box)
        box.snp_makeConstraints { (make) -> Void in
           make.width.height.equalTo(50)
           make.center.equalTo(self.view)
        }
    }
}

Kingfisher

github 地址:Kingfisher
介绍:A lightweight and pure Swift implemented library for downloading and caching image from the web. 值得注意的是,他有良好的 Cache management。她是借鉴 SDWebImage 这个由 OC 编写的10000+star 图片加载框架。
推荐理由:比AlamofireImage强大,有更好的 cache management 方案。

Kingfisher 和 AlamofireImag 该如何选择?其实这是一个仁者见仁智者见智的问题。但说到功能强大当然是首选 Kingfisher。如果是简单图片展示不需要对图片进行过多操作 和 cache , AlamofireImage 也是能解决问题。

以下引用 Kingfisher Doc:

Features

  • Everything in Kingfisher is asynchronous, not only downloading, but also caching. That means you never need to worry about blocking your UI thread.
  • Multiple-layer cache. Downloaded images will be cached in both memory and disk. So there is no need to download again, this could boost your app's perceptual speed dramatically.
  • Cache management. You can set the max duration or size the cache takes. From this, the cache will be cleaned automatically to prevent taking too many resources.
  • Modern framework. Kingfisher uses NSURLSession and the latest technology of GCD, which makes it a strong and swift framework. It also provides you easy APIs to use.
  • Cancelable processing task. You can cancel the downloading process if it is not needed anymore.
  • Prefetching. You can prefetch and cache the images which might soon appear in the page. It will bring your users great experience.
  • Independent components. You can use the downloader or caching system separately. Or even create your own cache based on Kingfisher's code.
  • Options to decompress the image in background before rendering it, which could improve the UI performance.
  • Categories over UIImageView, NSImage and UIButton for setting image from an URL directly. Use the same code across all Apple platforms.
  • Support GIF seamlessly. You could just download and set your GIF images as the same as you do for PNG/JPEG format.

HanekeSwift

github 地址:HanekeSwift
简介:A lightweight generic cache for iOS written in Swift with extra love for images

DEMO:

let cache = Cache(name: "github")
let URL = NSURL(string: "https://api.github.com/users/haneke")!

cache.fetch(URL: URL).onSuccess { JSON in
    print(JSON.dictionary?["bio"])
}

以下引用 HanekeSwift DOC:

  • Generic cache with out-of-the-box support for UIImage, NSData, JSON and String
  • First-level memory cache using NSCache
  • Second-level LRU disk cache using the file system
  • Asynchronous fetching of original values from network or disk
  • All disk access is performed in background
  • Thread-safe
  • Automatic cache eviction on memory warnings or disk capacity reached
  • Comprehensive unit tests
  • Extensible by defining custom formats, supporting additional types or implementing custom fetchers
  • Zero-config UIImageView and UIButton extensions to use the cache, optimized for UITableView and UICollectionView cell reuse
  • Background image resizing and decompression

可能你会问,HanekeSwift 和 Kingfisher 都是简化异步处理网络数据和图片的那该如何选择它们呢?首先从 star 数上看 HanekeSwift 3000+, Kingfisher 4000+ 其实差不多,毕竟到这个数量级看的已经不止是 star 数量,更多的是项目的活跃度。Kingfisher 更专注于 image 的加载和缓存,而 HanekeSwift 对 UIImage、NSData、JSON、String 都提供了很好的支持。所以如果是对多种数据希望通过统一的解决方案进行缓存管理, HanekeSwift 貌似会更合适。相反对 image 有较高的缓存管理要求,Kingfisher 则会更推荐。

TransitionTreasury

github地址:TransitionTreasury
简介:A viewController transition framework in Swift。我是被她绚丽的切换方式和简单的使用方法而迷倒。
使用说明:详细 Wiki

ios ViewController 的切换可以通过代码实现,也可以通过在 IB 中给ViewController 链接 Segue 来实现。两种方式各有优劣,也是根据个人习惯和实际需要来选择。TransitionTreasury 是通过代码来管理 ViewController 的跳转,使用起来比较简单。

作者提供的例子:

/// FirstViewController.swift
class FirstViewController: UIViewController {

    func push() {
        let vc = SecondViewController()
        navigationController?.tr_pushViewController(vc, method: TRPushTransitionMethod.Fade, completion: {
                print("Push finish")
            })
    }
}

/// SecondViewController.swift
class SecondViewController: UIViewController, NavgationTransitionable {

    var tr_pushTransition: TRNavgationTransitionDelegate?

    func pop() {
        tr_popViewController()
    }
}

而对于 IB 中链接 Segue 来控制跳转,被认为是推荐的方式。比较好的库有 IBAnimatable ,该库的作者推崇 IB 的使用,对绘制界面能少用代码尽量不用。

CryptoSwift

github地址:CryptoSwift
简介:CryptoSwift is a growing collection of standard and secure cryptographic algorithms implemented in Swift

常见的加解密过程都有,如果使用 Swift 作为开发语言,这是一个不可错过的库。

SwiftMessages

github 地址: SwiftMessages
简介:一个 Swift 编写的 Toast 控件。支持多种样式,当然也可以自定view。很强大。

to be continue...

你可能感兴趣的:(Swift 常用开源项目说明)