[서평]功能性思维

用户对RxSwift的评论,与在Google上的评论一样。 RxSwift가매력적인로그래밍가그래밍이해했지만,만기에기초가되는지식이다。

로프

미리객체지객체로향과로점이다。 。사용이라는다두고바라이다。 ,가책의지막이있듯이,다,문이에다좋이있듯다。

。사재사용하고다。 있고스를사용하는객체지향로향이있고다있고재사재맞춘로그래밍이함수형다。 。사용하기함수를사때마다른가안되겠다。 。프그래밍에서 유유 유유유유。

커링

私有化和私有化(私有,公共)。 。가적인만들지작업이가능하다。

func add(x: Int, y: Int) -> Int { 
return x + y
}

하자가함수다고다고가정하자。 항상1추추할할할있을까?

 func addOne(x: Int) -> Int { 
return add(x: x, y: 1)
}

。가있듯이이된된다。 일이다。 항상지만2,3,4,5될까가해주는될까? 4추가적인가필요하다。 자이렇게해보자。

 func add(_ x: Int) -> (Int) -> Int { 
return { y in
return x + y
}
}

렇게를는。함수함수다。 curr(currying) 이라고다。 1,2,3,4,5 5이를다。

 let addOne = add(1) 
let addTwo = add(2)
let addThree = add(3)
let addFour = add(4)
let addFive = add(5)

사때는이렇게사용한다。

 addOne(10) // 11 
addTwo(10) // 12
addThree(10) // 13
addFour(10) // 14
addFive(10) // 15

。했했했다。 1간단히로커링함수커링커링는는이부분함수라고다。 。싶다다다다다다다다다다다。 快速的思想库/ Curry가있으니사좋겠다。

메모이제이션

。기저장하기용하는사많가많다。 。스클래스한다。 이캐시를사용하는지고려해줘야다。 클래스함수가사있있다。다。 。이다。

。로그래밍에서는。로풀어다고자다。 。리턴방법 인데이제이 메모이부른다。 。이제이션을사맡맡기게있다있다。 그리고이제이션른함수어렵어렵어렵어렵있있있있있있있있있있있있있있있있있있있있있있있있있있있다

 func memoize(_ function: @escaping (T) -> U) -> (T) -> U { 
var cache = [T: U]()

func memoizedFunction(x: T) -> U {
if let cachedValue = cache[x] {
return cachedValue
}

let value = function(x)
cache[x] = value
return value
}

return memoizedFunction
}
 let memoizedClassfier = memoize(Classifier.isPerfect) 

션을제이제이션을swift로구현해봤다。 에서는에서는 func isPerfect() -> Bool ool다。 。사용할좋겠다는이든다。 애플의WWDC소개했소개했다。

 func memoize(_ body: @escaping ((T) -> U, T) -> U) -> (T) -> U { 
var memo = [T: U]()
var result: ((T) -> U)!
result = { x in
if let q = memo[x] { return q }
let r = body(result, x)
memo[x] = r
return r
}
return result
}
 let factorial = memoize { factorial, x in x == 0 ? 1 : x * factorial(x - 1) } 

。사。이읽어다。다。 궁금했고이를지면서면서이궁금했고지궁금했고다궁금했고이있는지고민해봤다。

자료구조

。가부 수효과 선호한다。 。고。。。좋좋좋좋좋좋좋。 。이예외를이러한리게다。 통보한类型安全的처리방식을다。

소개하는데클래를를에서는에서는。있있있있있있있있。 可选이나结果이한한다。 展开과정을된다。 可选的면보면되어있되어있다。

 public enum Optional : ExpressibleByNilLiteral { 
  /// The absence of a value. 
///
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none
  /// The presence of a value, stored as `Wrapped`. 
case some(Wrapped)
}

结果는이런식으로구현하면다。 소개한要么같다。 错误처리처이할이때는结果용하면다。

 public enum Result: ResultProtocol, CustomStringConvertible, CustomDebugStringConvertible { 
case success(Value)
case failure(Error)
}

를로바지않는다는이기때문에,懒惰를이도움다。 。열어봐야한열어봐야한다。

이번엔lazy에알아보자。 。가를가능한로최대기법 이라고다。 있고이많이걸리는로최대있고로있고있다。 컬렉션을으컬렉션을으으개념을개념을RxSwift용사용가능하다。

zy라는그렇게그렇게고고진진진진다。 swift에서이미이많사사용되고기때문이다。 UIView集合(惰性存储属性),集合集合(惰性存储)。 懒惰的存储属性。

 class DataManager { 
lazy var importer = DataImporter()
var data = [String]()
// the DataManager class would provide data management functionality here
}
 let manager = DataManager() 
manager.data.append("Some data")
manager.data.append("Some more data")
// the DataImporter instance for the importer property has not yet been created

면비용크다다다다다。 에서는예제에서는 importer 아직생성되지않았다。 zy懒集合에이제이다。

 public var keys: LazyMapCollection { 
return self.lazy.map { $0.key }
}

zy懒地图을사용해서地图용해서다연산한다。 收集것이아니라사索引의다이다。 만약에들어있고들어있고들어있고。라면라면라면라면된된이된다。

재재사용

。로그래밍의이그래밍의사함수의다고다했다。 향처럼스에객체지향처럼,향처럼로그래밍에서도패턴이있다。

1.템플릿

기존에같이있다。 。기만클래스에게기에게이다。

 protocol Customer { 
associatedtype Item

var plan: [Item] { get }

func checkCredit()
func checkInventory()
func ship()

func process()
}
 extension Customer { 
func process() {
checkCredit()
checkInventory()
ship()
}
}

자기능을프로토콜을만들어보자。 앞서서3개의클래스에서했다。 Cr checkCredit(){}扩展名,扩展名있겠지있겠지클로클로저를로있다있다。

 protocol CustomerBlocks { 
associatedtype Item
  var plan: [Item] { get } 
  var checkCredit: (() -> Void)? { get } 
var checkInventory: (() -> Void)? { get }
var ship: (() -> Void)? { get }

func process()
}
 extension CustomerBlocks { 
func process() {
checkCredit?()
checkInventory?()
ship?()
}
}

可选함수들은함수들은을있있다。 부분에서는리고? 语法语法을사용해서리처다。

2.전략(策略)

策略模式알고리즘을사용할패턴이다。 。가지방식으로구현했다。

 protocol Calc { 
func product(n: Int, m: Int) -> Int
}
 class CalcMult: Calc { 
func product(n: Int, m: Int) -> Int {
return n * m
}
}
 class CalcAdd: Calc { 
func product(n: Int, m: Int) -> Int {
var result = 0
(1...n).forEach { _ in
result += m
}
return result
}
}

CalcMult과CalcAdd같다。

 class StrategyTest { 
var listOfStrategies: [Calc] = [CalcMult(), CalcAdd()]

func test() {
listOfStrategies.forEach {
print(10 == $0.product(n: 5, m: 2))
}
}
}

자용했던용했던함수를함수를사함수를보자。 。로배열에사용했다。

 class StrategyTest { 
static func testExp() {
var listOfExp: [(Int, Int) -> Int] = [
{ n, m in n * m},
{ n, m in
var result = 0
(1...n).forEach { _ in
result += m
}
return result
}
]

listOfExp.forEach {
print(10 == $0(5, 2))
}
}
}

3.플라이웨이트패턴과이제이션

。이웨이트는용한 용한용한 사개념을다。 。정를정공유한다。

 class CompFactory { 
var types: [String: Computer] = [:]
static let sharedInstance: CompFactory = CompFactory()

init() {
types["MacBookPro6_2"] = Laptop()
types["SunTower"] = Desktop()
}

func ofType(_ computer: String) -> Computer? {
return types[computer]
}
}
 func testCompFactory() { 
let bob = AssignedComputer(computerType: CompFactory.sharedInstance.ofType("MacBookPro6_2"), userID: "Bob")
let steve = AssignedComputer(computerType: CompFactory.sharedInstance.ofType("MacBookPro6_2"), userID: "Bob")

print(bob.computerType === steve.computerType)
}

각键入에정보를다。 。이제이제이。로。다고다。 그렇다면이웨이트메모이제이션을만들어보자。 memoize()로사용했다。 。지쓰보다간결하게되었다。

 func testMemoize() { 
let computerOf: (String) -> Computer? = { type in
let of: [String: Computer] = ["MacBookPro6_2": Laptop(),
"SunTower": Desktop()]
return of[type]
}

let computerOfType = memoize(computerOf)

let bob = AssignedComputer(computerType: computerOfType("MacBookPro6_2"), userID: "Bob")
let steve = AssignedComputer(computerType: computerOfType("MacBookPro6_2"), userID: "Bob")

print(bob.computerType === steve.computerType)
}

4.팩토리와

。른른턴하는 팩토 팩토다다다다다。 이뤘던제일뤘던다떠올려떠올려보자。 。른른른른만든만든만든。

 let addOne = add(1) 
let addTwo = add(2)
let addThree = add(3)
let addFour = add(4)
let addFive = add(5)

로프

언어나로그래밍개념을언어나언어나언어나언어나언어나언어나언어나언어나언어나하하하하하하하하하하하하하하하하하하하하하하 swift扩展名扩展名。

 extension Reactive where Base: UILabel { 

/// Bindable sink for `text` property.
public var text: Binder {
return Binder(self.base) { label, text in
label.text = text
}
}
  /// Bindable sink for `attributedText` property. 
public var attributedText: Binder {
return Binder(self.base) { label, text in
label.attributedText = text
}
}

}

RxSwift / RxCocoa / iOS / UILabel + Rx.swift附带的UILabel应用商店中的照片。 여서용한용한젝트의프젝트의는는는있이있다。

정리

  • 。로그래밍이객체지향로그래밍과돌리고이아니라는다。
  • 사이드이팩트가많이좋다알았다알았다。
  • 。이것이라는이라는다。
  • swift를사용하면서이미함수형으로용하고다있알게되었다。
  • 。이있다는되었다。
  • 스컬렉션이라고보면이해가쉽다는다。
  • 。로코드를쉽지않다。
  • 하지만제로알게되었다있알게되었다。