Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Develop with Swift
Search
Morita Naoki
November 27, 2015
Technology
1.4k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Develop with Swift
Swift development environment is already prepared.
Morita Naoki
November 27, 2015
More Decks by Morita Naoki
See All by Morita Naoki
TouchVisualizer Demo movie #potatotips
morizotter
1
5.5k
KPTをやってみた
morizotter
4
21k
Other Decks in Technology
See All in Technology
AIエージェントを雇う前に決める5つのこと
knishioka
1
160
grill-me(grilling):AI駆動開発を超助けてくれるSkill / grill me
mathbullet
0
100
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
190
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
150
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
350
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
270
Bet AI Day 2026丨Agentは、「金融」という巨大産業の何を変えられるのか
layerx
PRO
0
770
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous Browser Application Performance Monitoring; Act 1
moznion
0
110
【Oracle AI Spotlight ウェビナー】AWSか、Azureか、Google Cloudか。その議論にオラクルを含める意義。
oracle4engineer
PRO
2
230
動画配信アプリでの Engage SDK 導入 — TVer Android が Play ストアにコンテンツを届けるまで
techtver
PRO
0
110
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
190
【試作】IoT x AIエージェント
happysamurai294
0
120
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
Claude Code のすすめ
schroneko
67
230k
Designing for Timeless Needs
cassininazir
1
470
Making the Leap to Tech Lead
cromwellryan
135
10k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Building an army of robots
kneath
306
46k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
330
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
GraphQLとの向き合い方2022年版
quramy
50
15k
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