柯里化
柯里化就是把接受多個(gè)參數(shù)的方法變換成接受第一個(gè)參數(shù)的方法苍蔬,并且返回接受余下的參數(shù)并且返回結(jié)果的新方法。
func addTwoNumber(a: Int)(num: Int) -> Int {
return a + num
}
let addToFour = addTwoNumber(4)
let result = addToFour(6) // result is 10
Sequence
Swift 的 for...in 可以用在所有實(shí)現(xiàn)了 SequenceType 的類(lèi)型上,而為了實(shí)現(xiàn) SequenceType 你首先需要實(shí)現(xiàn)一個(gè) GeneratorType坯门。比如一個(gè)實(shí)現(xiàn)了反向的 generator 和 sequence 可以這么寫(xiě):
// 先定義一個(gè)實(shí)現(xiàn)了 GeneratorType protocol 的類(lèi)型
// GeneratorType 需要指定一個(gè) typealias Element
// 以及提供一個(gè)返回 Element? 的方法 next()
class ReverseGenerator: GeneratorType {
typealias Element = Int
var counter: Element
init<T>(array: [T]) {
self.counter = array.count - 1
}
init(start: Int) {
self.counter = start
}
func next() -> Element? {
return self.counter < 0 ? nil : counter--
}
}
// 然后我們來(lái)定義 SequenceType
// 和 GeneratorType 很類(lèi)似返敬,不過(guò)換成指定一個(gè) typealias Generator
// 以及提供一個(gè)返回 Generator? 的方法 generate()
struct ReverseSequence<T>: SequenceType {
var array: [T]
init (array: [T]) {
self.array = array
}
typealias Generator = ReverseGenerator
func generate() -> Generator {
return ReverseGenerator(array: array)
}
}
let arr = [0,1,2,3,4]
// 對(duì) SequenceType 可以使用 for...in 來(lái)循環(huán)訪問(wèn)
for i in ReverseSequence(array: arr) {
print("Index \(i) is \(arr[i])")
}
??
var level : Int?
var startLevel = 1
var currentLevel = level ?? startLevel // currentLevel = startLevel
??聲明為:
func ??<T>(optional: T?, @autoclosure defaultValue: () -> T?) -> T?
func ??<T>(optional: T?, @autoclosure defaultValue: () -> T) -> T
猜測(cè)第二種的實(shí)現(xiàn)為:
func ??<T>(optional: T?, @autoclosure defaultValue: () -> T) -> T {
switch optional {
case .Some(let value):
return value
case .None:
return defaultValue()
}
}
定義一個(gè)操作符
infix operator +* {
associativity none
precedence 160
}
infix:中位操作符,前后都是輸入头岔,其他還包括prefix, postfix塔拳。
associativity:定義了結(jié)合律,加法和減法都是left(從左往右)峡竣,這里none表示結(jié)果不會(huì)再和其他結(jié)合靠抑。
precedence:優(yōu)先級(jí),乘除是150适掰,加減是140颂碧,這里160最高。