Last active
July 14, 2018 03:27
-
-
Save jollyjoester/64217011c9c9a3d56358f4a0e2a48d24 to your computer and use it in GitHub Desktop.
swift-and-legacy of functional-programming.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
// try! Swift NYC 2016 | |
// https://academy.realm.io/posts/tryswift-rob-napier-swift-legacy-functional-programming/ | |
// Sample1: 分解して再構築 | |
struct Person { | |
let name: String | |
let isValid: Bool = true | |
} | |
let names: [String] = ["jolly", "kumagai"] | |
// やりたいこと:nameからPersonを作ってPersonsの配列に格納したい | |
// ①初期状態 | |
//var persons: [Person] = [] | |
//for name in names { | |
// let person = Person(name: name) | |
// if person.isValid { | |
// persons.append(person) | |
// } | |
//} | |
// ②関心の分離 | |
//var possiblePersons: [Person] = [] | |
//for name in names { | |
// let possiblePerson = Person(name: name) | |
// possiblePersons.append(possiblePerson) | |
//} | |
// | |
//var persons: [Person] = [] | |
//for possiblePerson in possiblePersons { | |
// if possiblePerson.isValid { | |
// persons.append(possiblePerson) | |
// } | |
//} | |
// ③mapとfiltreを使う | |
//let possiblePersons = names.map(Person.init) | |
//let persons = possiblePersons.filter { $0.isValid } | |
// ④チェーンする | |
let persons = names | |
.map(Person.init) | |
.filter { $0.isValid } | |
// Sample2: | |
// ユーザー名とパスワードでログインしてその後何かさせたい | |
// ①初期状態 | |
//func login(username: String, password: String, completion: (String?, Error?) -> Void) { | |
// // 何かしらのログイン処理 | |
//} | |
// | |
//login(username: "jolly", password: "joester") { | |
// (token, error) in | |
// if let token = token { | |
// // success: tokenを使って何かする | |
// token | |
// } else if let error = error { | |
// // failure: errorを使って何かする | |
// error | |
// } | |
//} | |
// ②ラベルをつける | |
//func login(username: String, password: String, completion: (_ token: String?, Error?) -> Void) { | |
// //何かしらのログイン処理 | |
//} | |
// | |
//login(username: "jolly", password: "joester") { | |
// (token, error) in | |
// if let token = token { | |
// // success: tokenを使って何かする | |
// token | |
// } else if let error = error { | |
// // failure: errorを使って何かする | |
// error | |
// } | |
//} | |
// ③Tokenを型にする | |
//struct Token { | |
// let string: String | |
// // tokenだったら単なる文字列ではなく文字数とか文字種とか何かしら仕様があるはず | |
//} | |
// | |
//func login(username: String, password: String, completion: (Token?, Error?) -> Void) { | |
// //何かしらのログイン処理 | |
//} | |
// | |
//login(username: "jolly", password: "joester") { (token, error) in | |
// if let token = token { | |
// // success: tokenを使って何かする | |
// token | |
// } else if let error = error { | |
// // failure: errorを使って何かする | |
// error | |
// } | |
//} | |
// ④username AND passwordを型にする | |
//struct Credential { | |
// var username: String | |
// var password: String | |
//} | |
// | |
//struct Token { | |
// let string: String | |
// // tokenだったら単なる文字列ではなく文字数とか文字種とか何かしら仕様があるはず | |
//} | |
// | |
//let credential = Credential(username: "jolly", password: "joester") | |
// | |
//func login(credential: Credential, completion: (Token?, Error?) -> Void) { | |
// // 何かしらのログイン処理 | |
//} | |
// | |
//login(credential: credential) { (token, error) in | |
// if let token = token { | |
// // success: tokenを使って何かする | |
// token | |
// } else if let error = error { | |
// // failure: errorを使って何かする | |
// error | |
// } | |
//} | |
// ⑤token OR errorを型にする | |
enum Result<Value> { | |
case success(Value) | |
case failure(Error) | |
} | |
struct Credential { | |
var username: String | |
var password: String | |
} | |
struct Token { | |
let string: String | |
// tokenだったら単なる文字列ではなく文字数とか文字種とか何かしら仕様があるはず | |
} | |
let credential = Credential(username: "jolly", password: "joester") | |
func login(credential: Credential, completion: (Result<Token>) -> Void) { | |
// 何かしらのログイン処理 | |
} | |
login(credential: credential) { result in | |
switch result { | |
case .success(let token): | |
// success: tokenを使って何かする | |
token | |
// error | |
case .failure(let error): | |
// failure: errorを使って何かする | |
error | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment