Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jollyjoester/64217011c9c9a3d56358f4a0e2a48d24 to your computer and use it in GitHub Desktop.
Save jollyjoester/64217011c9c9a3d56358f4a0e2a48d24 to your computer and use it in GitHub Desktop.
swift-and-legacy of functional-programming.swift
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