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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
Exadata Fleet Update
oracle4engineer
PRO
0
1.3k
実録・Platform Engineering 失敗から学び、AI時代の波を乗りこなす技術
sansantech
PRO
1
100
マネージャー版 "提案のレベル" を上げる
konifar
16
12k
開発組織の課題解決を加速するための権限委譲 -する側、される側としての向き合い方-
daitasu
3
180
A Gentle Introduction to Transformers
keio_smilab
PRO
1
100
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
44k
AI Agentにおける評価指標とAgent GPA
tsho
1
280
入門DBSC
ynojima
0
130
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
22k
Databricksアシスタントが自分で考えて動く時代に! エージェントモード体験もくもく会
taka_aki
0
310
Webアクセシビリティ技術と実装の実際
tomokusaba
0
210
Kaggleで鍛えたスキルの実務での活かし方 競技とプロダクト開発のリアル
recruitengineers
PRO
1
100
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
RailsConf 2023
tenderlove
30
1.4k
Six Lessons from altMBA
skipperchong
29
4.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
200
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Are puppies a ranking factor?
jonoalderson
1
3.1k
KATA
mclloyd
PRO
35
15k
Why Our Code Smells
bkeepers
PRO
340
58k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
79
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