e as? T
は「T型かも知れないしそうでないかも知れないような値をOptional<T>に変換」という書き方だと思います。
swfit
1var a: Any = 1
2var b = a as? Int
3print(type(of: b)) // => Optional<Int>
ご質問にある通りOptional<Int>どうしを<
演算子で比較するのはいけないことになってますのでOptional<Int>ではなくInt型へ変換せねばなりません。
array.sort{$0[1] as! Int > $1[1] as! Int}
とすればそれができますが、これはプログラマーが絶対に型の変換が成功すると確信した上で使うものですので、万一Int型でないものを変換しようとした場合は実行時エラーが起きます。
https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html
質問意図とは外れますが、異なる型の値の集まりをArrayで表現するのは(静的型付けかつ優れた型推論能力を持っている)swift言語では下策に思えます。Arrayは全ての型が共通の場合のコレクションなので型が不一致のものを無理にまとめると要素の型がAnyとなってしまいます。本当はStringとIntの組であるにもかかわらず型の情報が消えてしまいますので不必要にキャストを使う羽目になります。
一般的になんらかの構造を表現するにはclass/structを用いることが多いと思いますが、コード内のごく狭い範囲でのみ用いるその場限りの構造を一々class/structとして宣言するのは面倒です。そんな場合はArrayではなくTupleを使ったほうがよいと思います。本件の場合なら「二次元配列」ではなく「Tupleの配列」とするわけです。Tupleなら要素の位置ごと(最初の要素、二番目の要素、...)に個別に型を推論してくれますので、本件のようなデータの場合だとarrayの各要素が「StringとIntの組」であると型推論してくれ型の曖昧性を排除できます。自然、不必要なキャストもなくなります。
swift
1var array = [("長男", 0), ("次男", 7), ("三男", 3), ("四男", 10), ("五男", 5)]
2print(type(of: array)) // => Array<(String, Int)>
3array.sort{$0.1 > $1.1}