Slide 1

Slide 1 text

4XJGU-JCSBSZ
 ͬ͘͟Γݱঢ়֬ೝ 4XJGU4UVEZୈճ

Slide 2

Slide 2 text

಺༰ w 4XJGUϥΠϒϥϦք۾ͷಈ޲ʹ͍ͭͯ w ͙͢׆༻Ͱ͖ͦ͏ͳ΋ͷΛϐοΫΞοϓ w ಺෦࣮૷΍࢖͍ํͰؾʹͳͬͨͱ͜ΖΛ঺հ

Slide 3

Slide 3 text

4XJGUք۾ͷࠓ w (JUIVCSFQPTJUPSZڧ MBOHVBHFTXJGUͰݕࡧ w $PDPB1PETͰͷެ։͸ະରԠ *TTVF w 5SFOEJOHʹ্͕͍ͬͯΔϥΠϒϥϦΛز͔ͭ঺հ͠·͢

Slide 4

Slide 4 text

)551௨৴

Slide 5

Slide 5 text

)551ϥΠϒϥϦ w 0CK$࣌୅ɿ"'/FUXPSLJOH w 4XJGU࣌୅ɿ
 "MBNPpSF
 /FU
 4XJGU)551

Slide 6

Slide 6 text

)551ϥΠϒϥϦ w 0CK$࣌୅ɿ"'/FUXPSLJOH w 4XJGU࣌୅ɿ
 "MBNPpSF
 /FU
 4XJGU)551

Slide 7

Slide 7 text

Alamofire.request(.GET, "http://api.example.com/user/horimi") .responseString { (request, response, string, error) in println(request) println(response) println(string) }

Slide 8

Slide 8 text

Alamofire.request(.GET, "http://api.example.com/user/horimi")
 .validate(statusCode: 200...<300)
 .validate(contentType: [“application/json”]) .responseString { (request, response, string, error) in println(request) println(response) println(string) }

Slide 9

Slide 9 text

"MBNPpSF w ϝιουνΣΠϯͰهड़Ͱ͖Δ w ػೳతʹෆࣗ༝ͳͦ͞͏ w ͪΐͬͱ͓΋͠Ζ͍ػೳ΋

Slide 10

Slide 10 text

GET api.example.com/user/horimi/entry/1234

Slide 11

Slide 11 text

GET api.example.com/user/horimi/entry/1234

Slide 12

Slide 12 text

Alamofire.request(.GET, ApiRouter.Entry("horimi", 1234))

Slide 13

Slide 13 text

enum ApiRouter: URLStringConvertible { static let baseURLString = "http://api.example.com" case User(String) case Entry(String, Int) var URLString: String { let path: String = { switch self { case .User(let userId): return "/user/\(userId)" case .Entry(let userId, let entryId): return "/user/\(userId)/entry/\(entryId)/" } }() return ApiRouter.baseURLString + path } }

Slide 14

Slide 14 text

3PVUFS 㾎 "1*FOEQPJOUͷ৘ใΛ&OVNʹด͡Δ͜ͱ͕Ͱ͖Δ 㾎 63-؅ཧ༻Ϋϥε͸ෆཁʹ 㾎 #MPH"QJTXJGUΈ͍ͨͳΫϥε΋ແͤͦ͘͏

Slide 15

Slide 15 text

+40/"1*ͱͷ࿈ܞ w %JDUJPOBSZΛੜͰѻ͏͜ͱΛආ͚Δ w +BWBͷ0CKFDU.BQQFSతͳࣄ w ݁ߏͨ͘͞Μग़ͯΔ
 4XJGUZ+40/
 +40/)FMQFS
 0CKFDU.BQQFS

Slide 16

Slide 16 text

+40/"1*ͱͷ࿈ܞ w %JDUJPOBSZΛੜͰѻ͏͜ͱΛආ͚Δ w +BWBͷ0CKFDU.BQQFSతͳࣄ w ݁ߏͨ͘͞Μग़ͯΔ
 4XJGUZ+40/
 +40/)FMQFS
 0CKFDU.BQQFS

Slide 17

Slide 17 text

Alamofire.request(.GET, "http://api.example.com/user/horimi/entry/1234") .responseSwiftyJSON { (request, response, json, error) in println(json) // => JSON type }

Slide 18

Slide 18 text

"MBNPpSF4XJGUZ+40/ ϨεϙϯεΛࣗಈతʹ4XJGUZ+40/ͷܕʹ੔͑ͯ͘ΕΔ ೚ҙͷϞσϧʹϚοϓ͢Δͷ͸ࣗલͰ 4XJGUͷ࢓্༷+BDLTPOΈ͍ͨͳࣄΛ͢Δͷ͸ݫͦ͠͏

Slide 19

Slide 19 text

6UJMJUJFT

Slide 20

Slide 20 text

9$(-PHHFS w ϩάϨϕϧ͕ଘࡏ͢Δ EFCVH JOGP FSSPS w 4IBSFEJOTUBODFʹରͯ͠ઃఆ͕Մೳ
 ྫQSPEͳΒϩάΛు͖ग़͞ͳ͍ w ϑΝΠϧॻ͖ग़͠ʹ΋ରԠ͍ͯ͠Δ

Slide 21

Slide 21 text

let log = XCGLogger.defaultInstance() @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { log.setup(logLevel: .Debug, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil) log.info("Initialized") return true } ... }

Slide 22

Slide 22 text

public enum LogLevel: Int, Comparable { case Verbose case Debug case Info case Error case Severe case None } public func < (lhs:XCGLogger.LogLevel, rhs:XCGLogger.LogLevel) -> Bool { return lhs.rawValue < rhs.rawValue }

Slide 23

Slide 23 text

var outputLogLevel: XCGLogger.LogLevel = .Debug func isEnabledForLogLevel (logLevel: XCGLogger.LogLevel) -> Bool { return logLevel >= self.outputLogLevel }

Slide 24

Slide 24 text

΍ͬͺ4XJGUͷ&OVNྑ͍ w &OVNΛൺֱՄೳʹ
 ೥ྸɺϨϕϧ౳ͷσʔλͰ
 ࢖͑ͦ͏ w DBTFͷॱ൪ʹ͸஫ҙ
 SBX7BMVF+BWBͷPSEJOBM 
 ҙຯ͕খ͍͞ॱʹྻڍ͢Δ w ͦΕͧΕʹϝιου͕ඞཁ
 ౳Ձԋࢉ͸&RVBUBCMFQSPUPDPM enum Size: Int, Comparable { case Large case Medium case Small } func < (l:Size, r:Size) -> Bool { return l.rawValue < r.rawValue } var flag = Size.Small < Size.Large // => false

Slide 25

Slide 25 text

public class XCGConsoleLogDestination : XCGLogDestinationProtocol, DebugPrintable { … public func processLogDetails(logDetails: XCGLogDetails) { … var fullLogMessage: String = “…” dispatch_async(XCGLogger.logQueue) { print(fullLogMessage) } } }

Slide 26

Slide 26 text

ग़ྗઌΧελϚΠζՄೳ w ίϯιʔϧग़ྗ͸9$($POTPMF-PH%FTUJOBUJPO͕୲౰
 MPHCBDLͷ$POTPMF"QQFOEBS w 9$(-PH%FTUJOBUJPO1SPUPDPMΛ࣮૷͢Ε͹
 ΧελϜͷग़ྗઌ͕࣮ߦͰ͖Δ w )551ӽ͠ʹϩάΛૹΔ͜ͱ΋Ͱ͖ͦ͏ USBDLJOHͱ͔

Slide 27

Slide 27 text

5FTU

Slide 28

Slide 28 text

2VJDL w #%%ͳςετϑϨʔϜϫʔΫ w 9$5FTUΑΓߴ͍Մಡੑ w ςετϑϨʔϜϫʔΫͳͷͰΧδϡΞϧʹࢼͤΔ

Slide 29

Slide 29 text

func testGetUserSuccess() { XCTAssertNotNil(User.get("horimi")) XCTAssertNil(User.get("vavavavavava")) }

Slide 30

Slide 30 text

class UserSpec: QuickSpec { override func spec() { describe("User") { it("should exist") { expect(User("horimi")).notTo(nil) } it("should not exist") { expect(User.get("vavavavava")).to(nil) } } } }

Slide 31

Slide 31 text

·ͱΊ w 4XJGUք۾ͷݱঢ়ɾؾʹͳΔϥΠϒϥϦ঺հ w ಺෦࣮૷΍࢖͍ํʹ͍ͭͯ w બఆ͚ͩͰͳ͘ɺ಺෦࣮૷ݟΔͱֶͼଟ͍ͷͰੋඇʂ

Slide 32

Slide 32 text

ࢀߟ w 5SFOEJOH4XJGUSFQPTJUPSJFTPO(JU)VCUIJTNPOUI w 'JSTUQIBTFUPXBSET$MBOH.PEVMFT'SBNFXPSLTu *TTVFu$PDPB1PET$PDPB1PET w "MBNPpSF"MBNPpSF w OHIJBMW/FU w EBMUPOJBN4XJGU)551

Slide 33

Slide 33 text

ࢀߟ w 4XJGUZ+40/4XJGUZ+40/ w JTBJS+40/)FMQFS w %BWF8PPE$PN9$(-PHHFS w 4XJGU4UBOEBSE-JCSBSZ3FGFSFODF$PNQBSBCMF w 2VJDL2VJDL