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
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
Data Hubグループ 紹介資料
sansan33
PRO
0
2.7k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
68k
制約が導く迷わない設計 〜 信頼性と運用性を両立するマイナンバー管理システムの実践 〜
bwkw
3
920
配列に見る bash と zsh の違い
kazzpapa3
1
130
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
590
Embedded SREの終わりを設計する 「なんとなく」から計画的な自立支援へ
sansantech
PRO
3
2.3k
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
生成AI時代にこそ求められるSRE / SRE for Gen AI era
ymotongpoo
5
3.1k
Context Engineeringが企業で不可欠になる理由
hirosatogamo
PRO
3
550
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
2
180
小さく始めるBCP ― 多プロダクト環境で始める最初の一歩
kekke_n
1
390
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
170
Featured
See All Featured
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
320
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
410
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
430
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
30 Presentation Tips
portentint
PRO
1
210
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
330
Crafting Experiences
bethany
1
48
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
A better future with KSS
kneath
240
18k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Curse of the Amulet
leimatthew05
1
8.4k
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