Download - Swiftの関数型っぽい部分
SWIFT2014.7.9
bOb_sTrane@Phybbit
/ /twitter github Qiita
Swift
Swift
@bOb_sTrane(Qiita/Twitter)Phybbit iOS /Rails
( ...) , FRP(Lisp Scala Haskell )
SWIFT
SWIFT1.
2.
3.
4.
// 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が出力
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ずつカウントダウン}
// 普通に定義
func greeting(name: String) {
println("Hello \(name)")
}
greeting("Taro")
// 関数を変数に代入して定義
let greeting = { (name:String) -> Void in
println("Hello \(name)")
}
greeting("Taro")
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)// }
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 }
(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がコールされない
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がコールされる
SWIFT
SWIFT
@lazy
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)!"
}()
( ) 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
Blockslazy
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
7 1 otakyou.com( )https://www.otakyou.com/