![](/img/trans.png)
[英]How do I disambiguate this call to a generic function with a function parameter in Swift?
[英]How to call a generic function with no parameter?
向Array添加擴展,返回第一個Int或String很簡單:
extension Array {
func firstInt() -> Int? {
return self.flatMap{$0 as? Int}.first
}
func firstString() -> String? {
return self.flatMap{$0 as? String}.first
}
}
let a1:[AnyObject?] = [nil, "abc", 3, 4]
let a2:[AnyObject?] = [nil, [3], [ "foo":"bar" ]]
print(a1.firstInt()) // Optional(3)
print(a2.firstInt()) // nil
print(a1.firstString()) // Optional("abc")
print(a2.firstString()) // nil
我可以定義一個通用版本,但我無法弄清楚如何調用它,因為它不帶任何參數。 沒有參數,我無法指定類型!
extension Array {
func firstValueOfType<T>() -> T? {
return self.flatMap{$0 as? T}.first
}
}
// I can't figure out how to call this method!
我可以通過添加一個虛擬參數來解決它,但這很難看。
extension Array {
func firstValueLike<T>(_:T) -> T? {
return self.flatMap{$0 as? T}.first
}
}
let a1:[AnyObject?] = [nil, "abc", 3, 4]
print(a1.firstValueLike(1)) // Optional(3)
print(a1.firstValueLike("")) // Optional("abc")
如果有人能告訴我如何調用firstValueOfType函數(或者干凈地定義泛型函數的替代方法),我將不勝感激。
“無法明確專門化泛型函數”是類似的,但由於Optional,我的問題有點復雜。
我從OOPer得到了一個很好的答案,它甚至包括使用lazy.filter而不是flatMap的更好的實現。
extension Array {
func firstValueOfType<T>() -> T? {
return self.lazy.filter {$0 is T}.first as? T
}
}
let a1:[AnyObject?] = [nil, "abc", 3, 4]
print(a1.firstValueOfType() as Int?) // Optional(3)
print(a1.firstValueOfType() as String?) // Optional("abc")
非常感謝您的快速支持!
一種方法是將結果分配給具有顯式類型的變量。
let i: Int? = a1.firstValueOfType()
print(i) // Optional(3)
let s: String? = a1.firstValueOfType()
print(s) // Optional("abc")
另一個as
:
print(a1.firstValueOfType() as Int?) // Optional(3)
print(a1.firstValueOfType() as String?) // Optional("abc")
您可以將類型作為參數T.Type
,如下所示:
extension Array {
func firstValue<T>(like type: T.Type) -> T? {
return self.flatMap{$0 as? T}.first
}
}
[1,2,3].firstValue(like: Int.self)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.