Swift 4:非标称类型'T'不支持显式初始化

时间:2017-09-20 20:35:56

标签: swift swift4

我编写了一个扩展程序,可以在Collection中搜索某种类型的对象。

extension Collection {
    /// Finds and returns the first element matching the specified type or nil.
    func findType<T>(_ type: T.Type) -> Iterator.Element? {
        if let index = (index { (element: Iterator.Element) in
            String(describing: type(of: element)) == String(describing: type) }) {
            return self[index]
        }
        return nil
    }
}

现在在Xcode 9 / Swift 4中,代码段type(of: element))带有错误的下划线

  

非标称类型'T'不支持显式初始化

错误很奇怪,因为我没有初始化对象。

这个答案https://stackoverflow.com/a/46114847/2854041表明它可能是一个类型问题 - 在Swift 4中String(描述:)初始化器是否发生了变化?

2 个答案:

答案 0 :(得分:6)

您不应该使用String(describing:)来比较值,尤其不应该使用它来比较类型。 Swift为两者都内置了方法。要检查变量是否属于某种类型,您可以使用is关键字。

此外,您还可以利用内置的first(where:)方法并检查闭包内的类型。

extension Collection {
    /// Finds and returns the first element matching the specified type or nil.
    func findType<T>(_ type: T.Type) -> Iterator.Element? {
        return self.first(where: {element in element is T})
    }
}

测试数据:

let array: [Any] = [5,"a",5.5]
print(array.findType(Int.self) ?? "Int not found")
print(array.findType(Double.self) ?? "Double not found")
print(array.findType(Float.self) ?? "Float not found")
print(array.findType(String.self) ?? "String not found")
print(array.findType(Bool.self) ?? "Bool not found")

输出:

5
5.5
Float not found
a
Bool not found

答案 1 :(得分:4)

这是我得到的错误 enter image description here

它与type(of:和参数type混淆。

更改T.Type参数名称后。它的工作:

extension Collection {
    /// Finds and returns the first element matching the specified type or nil.
    func findType<T>(_ typeT: T.Type) -> Iterator.Element? {
        if let index = (index { (element: Iterator.Element) in
        String(describing: type(of: element)) == String(describing: typeT) }) {
            return self[index]
        }
        return nil
    }
}