Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Develop with Swift
Search
Morita Naoki
November 27, 2015
Technology
3
1.4k
Develop with Swift
Swift development environment is already prepared.
Morita Naoki
November 27, 2015
Tweet
Share
More Decks by Morita Naoki
See All by Morita Naoki
TouchVisualizer Demo movie #potatotips
morizotter
1
5.4k
KPTをやってみた
morizotter
4
21k
Other Decks in Technology
See All in Technology
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
370
MLflowダイエット大作戦
lycorptech_jp
PRO
1
120
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
1.3k
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
190
OCI Oracle Database Services新機能アップデート(2025/09-2025/11)
oracle4engineer
PRO
1
200
大企業でもできる!ボトムアップで拡大させるプラットフォームの作り方
findy_eventslides
1
780
ChatGPTで論⽂は読めるのか
spatial_ai_network
9
28k
Python 3.14 Overview
lycorptech_jp
PRO
1
110
グレートファイアウォールを自宅に建てよう
ctes091x
0
150
AWS Security Agentの紹介/introducing-aws-security-agent
tomoki10
0
260
AWS Trainium3 をちょっと身近に感じたい
bigmuramura
1
140
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
710
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Statistics for Hackers
jakevdp
799
230k
Why Our Code Smells
bkeepers
PRO
340
57k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Music & Morning Musume
bryan
46
7k
Fireside Chat
paigeccino
41
3.7k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Docker and Python
trallard
47
3.7k
Practical Orchestrator
shlominoach
190
11k
Scaling GitHub
holman
464
140k
Transcript
Develop with Swift
ాɹथ
morizotter
2015
Github http://github.com/morizotter
Github Award https://github-awards.com/users/search?login=morizotter
TouchVisualizer https://github.com/morizotter/TouchVisualizer
SwiftyDrop https://github.com/morizotter/SwiftyDrop
Coggle https://coggle.it
Coggle https://coggle.it
Coggle https://coggle.it
Coggle https://coggle.it
angularjs-style-guide https://github.com/mgechev/angularjs-style-guide/blob/ master/README-ja-jp.md
angularjs-style-guide https://github.com/mgechev/angularjs-style-guide/blob/ master/README-ja-jp.md
Other contributions • SDWebImage • SwiftBond - Japanese 2 way
binding • Evernote SDK • Treasuredata SDK • DateTools • Carthage • NVActivityIndicatorView • TagListView • FlatUIColors • …
Develop with Swift
Qolk Cozy Qiita Reader for iOS.
Qolk Cozy Qiita Reader for iOS.
Qolk QiitaΫϥΠΞϯτͷQolkΛMacbookͱCarthageͰ࡞ͬͨ http://qiita.com/morizotter/items/90d6d6024a6e7e0e9e84
Powerful Swift OSSs. • Dependency Manager: Carthage • Networking: Alamofire
• JSON parser: SwiftyJSON • Database: Realm • Future(promise): BrightFutures • View binding: SwiftBond • Image loading: Kingfisher • AutoLayout: SnapKit
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?
Core OSSs • Carthage • Alamofire • BrightFutures • SwiftyJSON
Carthage for all
Carthage • Decentralized • No .xcworkspace • Clean & Simple
• Very Easy to distribute • Increasing • Centralized • .xcworkspace • Easy to use • Easy to distribute • Already many Cocoapods https://github.com/Carthage/Carthage https://cocoapods.org/
Carthage $ brew update $ brew install carthage $ cd
move/to/app/root $ vi Cartfile github "Alamofire/Alamofire" == 3.1.2 wq $ carthage update -platform ios
Carthage
Carthage • Pros: • Project remains clean. • No build
time. • Cons: • Library build time. • Relatively fewer libraries.
If library doesn’t compatible with Carthage?
Fork! Tweak! (Pull Request!)
Just 4 steps 1. Create CocoaTouch Framework 2. Add files
to Framework target 3. Make scheme shared 4. git push and tag in Github
I made 5 libraries or more Carthage Compatible for Qolk.
Many Thanks.
Alamofire SwiftyJSON BrightFutures cooperate.
BrightFutures Networking system API Server App SwiftyJSON
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.
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.
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.
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 } … }
Sync Wantedly