使用未声明的类型'T'Xcode 9

时间:2017-10-03 13:48:21

标签: swift

自从我更新到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

    }

}

1 个答案:

答案 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而不使该函数成为通用。