Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.


func sum<T : Numeric>(of values: Array<T>) -> T {
return values.reduce(0) { $0 + $1 }
}
// Int の配列でも、Float の配列でも、使える
let i...
func average <C:Collection> (of values: C ) -> C.Element
where C.Element : BinaryInteger {
return values.reduce(into: 0, +...
extension Array {
// 変換元は、要素の型が同じならどんな Sequence でも良い
init<S:Sequence>(_ s: S) where Element == S.Element
}
// どんな Sequence...
// この書き方はパッと思いつかなくても、
func sum<T : Numeric>(of values: Array<T>) -> T {
return values.reduce(into: 0, +=)
}
// こちらなら自然と書ける...
struct Array :
MutableCollectionType,
Sliceable,
ArrayLiteralConvertible {
}
// Swift 1 は“写像(map)”が主体
func map<C:CollectionType, T>(source: C,
transform: (C.Generator.Element) -> T) -> [T]
// Swift 2...




func areaOfCircle<T:FloatingPoint>(withRadius radius: T) -> T {
return radius * radius * T.pi
}
areaOfCircle(withRadius: 2...


extension String {
// 現在主流の API
func repeated(_ count: Int) -> String
// Protocol-Oriented Integers を用いた API
func repeated...
extension String {
func repeated<T:UnsignedInteger>(_ count: T) -> String
}
"*".repeated(5)


Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Upcoming SlideShare
Loading in …5
×

Protocol-Oriented Integers に想うジェネリックプログラミングの未来

1,730 views

Published on

Protocol-Oriented Integers を目にして感じたことを 15 分の資料に綴ってみました。すごくざっくりとした説明で掴みきれないところもあると思うのですけど、今までとはちょっと違う視点でジェネリクスを見つめ直すきっかけになってくれたら幸いです。

Published in: Environment
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Protocol-Oriented Integers に想うジェネリックプログラミングの未来

  1. 1. 

  2. 2. func sum<T : Numeric>(of values: Array<T>) -> T { return values.reduce(0) { $0 + $1 } } // Int の配列でも、Float の配列でも、使える let integers = [5, 5, 5, 5] let floats = [2.5, 2.5, 2.5, 2.5] as [Float] sum(of: integers) // 20 sum(of: floats) // 10
  3. 3. func average <C:Collection> (of values: C ) -> C.Element where C.Element : BinaryInteger { return values.reduce(into: 0, +=) / C.Element(values.count) }
  4. 4. extension Array { // 変換元は、要素の型が同じならどんな Sequence でも良い init<S:Sequence>(_ s: S) where Element == S.Element } // どんな Sequence も配列型に変換できる Array([1, 5, 8, 3, 7, 3]) // Array Array([1, 5, 8, 3, 7, 3][2 ..< 5]) // ArraySlice Array(1 ..< 20) // CountableRange Array(zip([1, 3, 5], [2, 4, 6])) // Zip2Sequence<Array, Array>
  5. 5. // この書き方はパッと思いつかなくても、 func sum<T : Numeric>(of values: Array<T>) -> T { return values.reduce(into: 0, +=) } // こちらなら自然と書ける人も多いはず(上記より Swift らしいと思う) extension Array where Element : Numeric { func sum() -> Element { return reduce(into: 0, +=) } }
  6. 6. struct Array : MutableCollectionType, Sliceable, ArrayLiteralConvertible { }
  7. 7. // Swift 1 は“写像(map)”が主体 func map<C:CollectionType, T>(source: C, transform: (C.Generator.Element) -> T) -> [T] // Swift 2 は“コレクション”が主体 extension CollectionType { func map<T>(transform: (Generator.Element) -> T) -> [T] }
  8. 8.
  9. 9.
  10. 10. func areaOfCircle<T:FloatingPoint>(withRadius radius: T) -> T { return radius * radius * T.pi } areaOfCircle(withRadius: 2 as Double) // 12.566370614359172 areaOfCircle(withRadius: 2 as Float) // 12.56637 areaOfCircle(withRadius: 2 as Float80) // 12.566370614359172464
  11. 11.
  12. 12. extension String { // 現在主流の API func repeated(_ count: Int) -> String // Protocol-Oriented Integers を用いた API func repeated<T:BinaryInteger>(_ count: T) -> String } "*".repeated(5) // "*****"
  13. 13. extension String { func repeated<T:UnsignedInteger>(_ count: T) -> String } "*".repeated(5)
  14. 14.

×