自从我更新到Xcode 9后出现此错误:
使用未声明类型'T'
func addDistance(center: CLLocationCoordinate2D, latitudeKey: String = "lat", longitudeKey: String = "lng") -> [T] {
return self.map { (obj) -> T in
// Calculate distance
let location = CLLocation(latitude: obj.value(forKeyPath: latitudeKey) as! CLLocationDegrees, longitude: obj.value(forKeyPath: longitudeKey) as! CLLocationDegrees)
let center = CLLocation(latitude: center.latitude, longitude: center.longitude)
let distance = location.distance(from: center)
// Save
obj.objDist = distance
return obj
}
}
答案 0 :(得分:2)
您可能想要将addDistance函数声明为通用:
func addDistance<T>(center: ....)
此外,由于你在闭包中使用了obj.value(...),因此必须要有类型T,例如作为NSObject或其他带有value()函数的协议。
这意味着addDistance的泛型声明也必须为T。
指定此约束例如:
func addDistance<T:NSObject>(center: ....)
[编辑]
经过进一步考虑后,由于您使用的是self.map,因此您的addDistance函数可能是集合类型的一部分。
您要归还收藏品的元素:
self.map的封闭:(obj) - &gt; T ...,返回obj,因此T的类型与obj的类型相同,后者将是Element类型(在集合中)
鉴于此,T与集合元素的类型相同,您可以简单地将T替换为Element而不使该函数成为通用。