簡體   English   中英

如何調用沒有參數的泛型函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM