swiftの関数型っぽい部分

20
SWIFT 2014.7.9 bOb_sTrane@Phybbit / / twitter github Qiita

Upload: bobisstrange

Post on 27-Aug-2014

214 views

Category:

Software


7 download

DESCRIPTION

http://atnd.org/events/53235 Swift勉強会(STULIO×Phybbit)@21Cafe 2014/07/09 で発表した内容になります。

TRANSCRIPT

Page 1: Swiftの関数型っぽい部分

SWIFT2014.7.9

bOb_sTrane@Phybbit

/ /twitter github Qiita

Page 2: Swiftの関数型っぽい部分

Swift

Swift

Page 3: Swiftの関数型っぽい部分

@bOb_sTrane(Qiita/Twitter)Phybbit iOS /Rails

( ...) , FRP(Lisp Scala Haskell )

Page 4: Swiftの関数型っぽい部分

SWIFT

Page 5: Swiftの関数型っぽい部分

SWIFT1.

2.

3.

4.

Page 6: Swiftの関数型っぽい部分

// Intの引数2つを取り、和を返す関数func add(a: Int, b: Int) -> Int{ return a + b}

// Intの引数2つを取りIntを返す関数型を引数する関数func someFunc(mathFunction: (Int, Int) -> Int, a: Int, b: Int) { println(mathFunction(a, b))}

someFunc(add, 100, 200) // 300が出力

Page 7: Swiftの関数型っぽい部分

func stepForward(input: Int) -> Int { return input + 1}func stepBackward(input: Int) -> Int { return input - 1}func chooseStepFunction(isBackward: Bool) -> (Int) -> Int { return isBackward ? stepBackward : stepForward}var currVal = 10let moveNearerToZero = chooseStepFunction(currVal > 0)while currVal != 0 { currVal = moveNearerToZero(currVal) println(currVal) // 0まで1ずつカウントダウン}

Page 8: Swiftの関数型っぽい部分

// 普通に定義

func greeting(name: String) {

println("Hello \(name)")

}

greeting("Taro")

// 関数を変数に代入して定義

let greeting = { (name:String) -> Void in

println("Hello \(name)")

}

greeting("Taro")

Page 9: Swiftの関数型っぽい部分

func chooseStepFunction(isBackward: Bool) -> (Int) -> Int { // 関数内で関数を宣言 func stepForward(input: Int) -> Int { return input + 1 } func stepBackward(input:Int) -> Int { return input - 1 } return isBackward ? stepBackward : stepForward}var currentValue = -4let moveNearerToZero = chooseStepFunction(currentValue > 0)while currentValue != 0 { currentValue = moveNearerToZero(currentValue) println(currentValue)}// while currentValue != 0 {// stepForwardがスコープ外のため実行できない// currentValue = stepForward(currentValue)// }

Page 10: Swiftの関数型っぽい部分

let names = ["Taro", "Jiro", "Saburo", "Shiro", "Goro"]

// 通常の定義方法sorted(names) {(s1:String, s2:String) -> Bool in return s1 > s2 }// [Taro, Shiro, Saburo, Jiro, Goro]

// 型推論 (sorted関数の定義から推論される)sorted(names) { s1, s2 in return s1 > s2}

// 引数名の自動生成 & 暗示的なreturnsorted(names) { $0 > $1 }

Page 11: Swiftの関数型っぽい部分

(Blocks )class LeakPerson {

var name: String

@lazy var greeting: String = { return "Hello, \(self.name)" }()

init(name: String) { self.name = name }

deinit { println("LeakPerson deinit called") }

}

var leakPerson: LeakPerson! = LeakPerson(name:"Leak")

println(leakPerson.greeting)

leakPerson = nil // deinitがコールされない

Page 12: Swiftの関数型っぽい部分

class Person {

var name: String

@lazy var greeting: String = { [unowned self] in return "Hello, \(self.name)" }()

init(name: String) { self.name = name }

deinit { println("Person deinit called") }

}

var person: Person! = Person(name:"NotLeak")

println(person.greeting)

person = nil // deinitがコールされる

Page 13: Swiftの関数型っぽい部分

SWIFT

Page 14: Swiftの関数型っぽい部分

SWIFT

@lazy

Page 15: Swiftの関数型っぽい部分

class Person {

var name: String

@lazy var personalizedGreeting: String = {

[unowned self] in

println("heavy task started")

// Something very heavy task

for value in 0...20000000 {

if value > 10000000 && value % 100000 == 0{

println("value is \(value)")

}

}

println("personalizedGreeting called")

return "Hello, \(self.name)!"

}()

Page 16: Swiftの関数型っぽい部分

( ) init (name:String) { self.name = name println("initialized") } deinit { println("destructed") }}

var person: Person! = Person(name: "Strange Bob")println("person object has initialized")println(person.personalizedGreeting)person = nil

personalizedGreeting

Page 17: Swiftの関数型っぽい部分

Blockslazy

Page 18: Swiftの関数型っぽい部分

Swift

Swift --

Swift @lazy

How to do proper Lazy Loading in Swift

Learn Swift by running Scripts

Memory Leaks In The Swift Playground

Lazy Initialization with Swift

Page 19: Swiftの関数型っぽい部分
Page 20: Swiftの関数型っぽい部分

7 1 otakyou.com( )https://www.otakyou.com/