SWIFT
2014.7.9
bOb_sTrane@Phybbit
/ /twitter github Qiita
Swift
Swift
@bOb_sTrane(Qiita/Twitter)
Phybbit iOS /Rails
( ...) , FRP
(Lisp Scala Haskell )
SWIFT
SWIFT
1.
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 = 10
let 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 = -4
let 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}
// 引数名の自動生成 & 暗示的なreturn
sorted(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
Blocks
lazy
Swift
Swift --
Swift @lazy
How to do proper LazyLoadingin Swift
Learn SwiftbyrunningScripts
MemoryLeaks In The SwiftPlayground
LazyInitialization with Swift
7 1 otakyou.com
( )https://www.otakyou.com/

Swiftの関数型っぽい部分

  • 1.
  • 2.
  • 3.
    @bOb_sTrane(Qiita/Twitter) Phybbit iOS /Rails (...) , FRP (Lisp Scala Haskell )
  • 4.
  • 5.
  • 6.
    // 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が出力
  • 7.
    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 = 10 let moveNearerToZero = chooseStepFunction(currVal > 0) while currVal != 0 { currVal = moveNearerToZero(currVal) println(currVal) // 0まで1ずつカウントダウン }
  • 8.
    // 普通に定義 func greeting(name:String) { println("Hello (name)") } greeting("Taro") // 関数を変数に代入して定義 let greeting = { (name:String) -> Void in println("Hello (name)") } greeting("Taro")
  • 9.
    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 = -4 let moveNearerToZero = chooseStepFunction(currentValue > 0) while currentValue != 0 { currentValue = moveNearerToZero(currentValue) println(currentValue) } // while currentValue != 0 { // stepForwardがスコープ外のため実行できない // currentValue = stepForward(currentValue) // }
  • 10.
    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} // 引数名の自動生成 & 暗示的なreturn sorted(names) { $0 > $1 }
  • 11.
    (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がコールされない
  • 12.
    class Person { varname: 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がコールされる
  • 13.
  • 14.
  • 15.
    class Person { varname: 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)!" }()
  • 16.
    ( ) 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
  • 17.
  • 18.
    Swift Swift -- Swift @lazy Howto do proper LazyLoadingin Swift Learn SwiftbyrunningScripts MemoryLeaks In The SwiftPlayground LazyInitialization with Swift
  • 20.
    7 1 otakyou.com ()https://www.otakyou.com/