Array クラスの Min および Max 拡張機能を作成することで、Swift の Generics の理解を深めようとしています (C# の Min および Max Extension メソッドに似ています)。これを行うためのより良い方法があるかもしれませんが、私が言ったように、ジェネリックを理解するのに役立つだけです.
次のコードを作成しました。
extension Array {
func max<T, U : Comparable>(f: T -> U ) -> U? {
var maxSoFar : U? = nil
for i in self {
var itemValue = f(i as T)
if(maxSoFar == nil) {
maxSoFar = itemValue
}
if itemValue > maxSoFar {
maxSoFar = itemValue
}
}
return maxSoFar
}
func min<T, U : Comparable>(f: T -> U ) -> U? {
var minSoFar : U? = nil
for i in self {
var itemValue = f(i as T)
if(minSoFar == nil) {
minSoFar = itemValue
}
if itemValue < minSoFar {
minSoFar = itemValue
}
}
return minSoFar
}
}
テストするために、基本的な Person クラスを作成しました。
class Person {
var name : String
var age : Float
init(name: String, age: Float) {
self.name = name
self.age = age
}
}
私がクロージャーで明示的である場合、これらのケースではうまくいくようです:
var maximumAge = [Person(name: "Bob", age: 42), Person(name:"Mary", age:40)]
.max{ (p: Person) in p.age }! // Gives 42
var min = [100, 101].min{ (i: Int) in i }! // Gives 100
ただし、極端な省略形を使用するための型を推測することはできません。
var maximumAge = [Person(name: "Bob", age: 42), Person(name:"Mary", age:40)]
.max{ $0.age }! // Error
var min = [100, 101].min{ $0 }! // Error
または中程度の長さ:
var maximumAge = [Person(name: "Bob", age: 42), Person(name:"Mary", age:40)]
.max{p in p.age }! // Error
var min = [100, 101].min{ i in i }! // Error
誰かがこれについてまだ専門家である場合、私が間違っていることを教えてもらえますか? ここまでたどり着くのにかなりの読書とハッキングが必要だったことを認めなければなりません!
返信ありがとうございます