develop with swift

39
Develop with Swift

Upload: naoki-morita

Post on 14-Jan-2017

658 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Develop with Swift

Develop with Swift

Page 2: Develop with Swift

森田 直樹

Page 3: Develop with Swift

morizotter

Page 4: Develop with Swift

2015

Page 5: Develop with Swift

Githubhttp://github.com/morizotter

Page 6: Develop with Swift

Github Awardhttps://github-awards.com/users/search?login=morizotter

Page 7: Develop with Swift

TouchVisualizerhttps://github.com/morizotter/TouchVisualizer

Page 8: Develop with Swift

SwiftyDrophttps://github.com/morizotter/SwiftyDrop

Page 9: Develop with Swift

Cogglehttps://coggle.it

Page 10: Develop with Swift

Cogglehttps://coggle.it

Page 11: Develop with Swift

Cogglehttps://coggle.it

Page 12: Develop with Swift

Cogglehttps://coggle.it

Page 13: Develop with Swift

angularjs-style-guidehttps://github.com/mgechev/angularjs-style-guide/blob/

master/README-ja-jp.md

Page 14: Develop with Swift

angularjs-style-guidehttps://github.com/mgechev/angularjs-style-guide/blob/

master/README-ja-jp.md

Page 15: Develop with Swift

Other contributions

• SDWebImage

• SwiftBond - Japanese 2 way binding

• Evernote SDK

• Treasuredata SDK

• DateTools

• Carthage

• NVActivityIndicatorView

• TagListView

• FlatUIColors

• …

Page 16: Develop with Swift

Develop with Swift

Page 17: Develop with Swift

QolkCozy Qiita Reader for iOS.

Page 18: Develop with Swift

QolkCozy Qiita Reader for iOS.

Page 19: Develop with Swift

QolkQiitaクライアントのQolkをMacbookとCarthageで作った話

http://qiita.com/morizotter/items/90d6d6024a6e7e0e9e84

Page 20: Develop with Swift

Powerful Swift OSSs.

• Dependency Manager: Carthage

• Networking: Alamofire

• JSON parser: SwiftyJSON

• Database: Realm

• Future(promise): BrightFutures

• View binding: SwiftBond

• Image loading: Kingfisher

• AutoLayout: SnapKit

Page 21: Develop with Swift

Powerful Swift OSSs.

• Dependency Manager: Carthage Cocoapods

• Networking: Alamofire AFNetworking

• JSON parser: SwiftyJSON Mantle

• Database: Realm MagicalRecord/CoreData

• Future(promise): BrightFutures Bolts/PromiseKit

• View binding: SwiftBond ReactiveCocoa?

• Image loading: Kingfisher SDWebImage

• AutoLayout: SnapKit Masonry

Objective-C?

Page 22: Develop with Swift

Core OSSs

• Carthage

• Alamofire

• BrightFutures

• SwiftyJSON

Page 23: Develop with Swift

Carthage for all

Page 24: Develop with Swift

Carthage

• Decentralized

• No .xcworkspace

• Clean & Simple

• Very Easy to distribute

• Increasing

• Centralized

• .xcworkspace

• Easy to use

• Easy to distribute

• Already many

Cocoapodshttps://github.com/Carthage/Carthage https://cocoapods.org/

Page 25: Develop with Swift

Carthage

$ brew update$ brew install carthage$ cd move/to/app/root$ vi Cartfile

github "Alamofire/Alamofire" == 3.1.2

wq$ carthage update -platform ios

Page 26: Develop with Swift

Carthage

Page 27: Develop with Swift

Carthage

• Pros:

• Project remains clean.

• No build time.

• Cons:

• Library build time.

• Relatively fewer libraries.

Page 28: Develop with Swift

If library doesn’t compatible with

Carthage?

Page 29: Develop with Swift

Fork!

Tweak!

(Pull Request!)

Page 30: Develop with Swift

Just 4 steps

1. Create CocoaTouch Framework

2. Add files to Framework target

3. Make scheme shared

4. git push and tag in Github

Page 31: Develop with Swift

I made 5 libraries or more

Carthage Compatible for Qolk.

Page 32: Develop with Swift

Many Thanks.

Page 33: Develop with Swift

Alamofire

SwiftyJSON

BrightFutures

cooperate.

Page 34: Develop with Swift

BrightFutures

Networking system

API Server

App

SwiftyJSON

Page 35: Develop with Swift

Alamofire & BrightFutures

// AlamofireClient.swift

struct AlamofireClient { static let sharedInstance = AlamofireClient() let alamofire: Manager init() { let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.timeoutIntervalForResource = RequestTimeoutSec alamofire = Manager(configuration: configuration) } static func requestJSON(URLRequest: URLRequestConvertible) -> Future<JSONResponse, ErrorResponse> { let promise = Promise<JSONResponse, ErrorResponse>() sharedInstance.alamofire.request(URLRequest) .validate() .responseJSON(options: .AllowFragments) { (response) -> Void in log.debug("REQUEST: \(response.request)") log.debug("RESPONSE: \(response.response)”)

switch response.result { case .Success(let json): log.debug("[QIITA] JSON: \(json)") promise.success(JSONResponse(json: json, response: response.response!)) case .Failure(let error): log.debug("[QIITA] ERROR: \(error.localizedDescription)") self.errorHandling(error, response: response.response) promise.failure(ErrorResponse(nsError: error, response: response.response)) } } return promise.future } … } Return future.

Page 36: Develop with Swift

Responses

// AlamofireClient.swift

struct JSONResponse { var json = JSON([]) var response: NSHTTPURLResponse? var rateLimit: Int? var rateRemaining: Int? init(json: AnyObject?, response: NSHTTPURLResponse?) { if let json = json { self.json = JSON(json) } if let response = response { self.response = response let headers = JSON(response.allHeaderFields) self.rateLimit = headers["Rate-Limit"].int self.rateRemaining = headers["Rate-Remaining"].int } } }

struct ErrorResponse: ErrorType { var error: NSError var response: NSHTTPURLResponse? init(error: NSError, response: NSHTTPURLResponse? = nil) { self.nsError = error self.response = response } }

Make original struct for easy handling.

Page 37: Develop with Swift

BrightFutures & SwiftyJSON

// AppManager.swift

func getItems(pageInfo: PageInfo, query: String?) -> PageResponseFuture { let promise = Promise<PageResponse, ErrorResponse>() AlamofireClient.requestJSON(QiitaAPIRouter.Items(pageInfo: pageInfo, query: query)) .onSuccess { (result: JSONResponse) in let pageResponse = PageResponse(json: result.json, pageInfo: pageInfo, response: result.response!)

promise.success(pageResponse) } .onFailure { (errorResponse: ErrorResponse) in promise.failure(errorResponse) } return promise.future }

struct PageResponse { var json: JSON var totalCount: Int? var pageInfo: PageInfo init(json: JSON, pageInfo: PageInfo, response: NSHTTPURLResponse?) { self.json = json self.pageInfo = pageInfo if let response = response { let headers = JSON(response.allHeaderFields) self.totalCount = headers["Total-Count"].intValue } } }

typealias PageResponseFuture = Future<PageResponse, ErrorResponse>

Inject something before network returns.

Page 38: Develop with Swift

SwiftyJSON

final class Item: Object, ObjectCopyable { dynamic var renderedBody = "" dynamic var body = "" dynamic var coediting = false dynamic var createdAt = "" dynamic var itemId = "" dynamic var isPrivate = false let tags = List<Tag>() dynamic var title = "" dynamic var updatedAt = "" dynamic var url = "" dynamic var user: User? override static func primaryKey() -> String? { return "itemId" } class func fromJSON(json: JSON) -> Item { let item = Item() item.renderedBody = json["rendered_body"].stringValue item.body = json["body"].stringValue item.coediting = json["coediting"].boolValue item.createdAt = json["created_at"].stringValue item.itemId = json["id"].stringValue item.isPrivate = json["private"].boolValue item.title = json["title"].stringValue item.updatedAt = json["updated_at"].stringValue item.url = json["url"].stringValue item.user = User.fromJSON(json["user"]) for (_, subJson): (String, JSON) in json["tags"] { item.tags.append(Tag.fromJSON(subJson)) } return item } … }

Page 39: Develop with Swift

Sync Wantedly