Swift4:非标称类型'T'不支持显式初始化
Swift 4: Non-nominal type 'T' does not support explicit initialization
我编写了一个扩展程序,可以在 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))
下划线带有错误
Non-nominal type 'T' does not support explicit initialization
错误很奇怪,因为我没有初始化对象。
这个答案 表明这可能是一个类型问题 - Swift 4 中的 String(describing:) 初始值设定项是否发生了变化?
这是我遇到的错误
它与 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
}
}
您不应该使用 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
我编写了一个扩展程序,可以在 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))
下划线带有错误
Non-nominal type 'T' does not support explicit initialization
错误很奇怪,因为我没有初始化对象。
这个答案 表明这可能是一个类型问题 - Swift 4 中的 String(describing:) 初始值设定项是否发生了变化?
这是我遇到的错误
它与 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
}
}
您不应该使用 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