Другой пример:
class func getExchangeRate(#baseCurrency: String, foreignCurrency:String, completion: ((result:Double?) -> Void)!){
let baseURL = kAPIEndPoint
let query = String(baseCurrency)+"_"+String(foreignCurrency)
var finalExchangeRate = 0.0
if let url = NSURL(string: baseURL + query) {
NSURLSession.sharedSession().dataTaskWithURL(url) { data, response, error in
if ((data) != nil) {
let jsonDictionary:NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary
if let results = jsonDictionary["results"] as? NSDictionary{
if let queryResults = results[query] as? NSDictionary{
if let exchangeRate = queryResults["val"] as? Double{
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
dispatch_async(dispatch_get_main_queue()) {
completion(result: exchangeRate)
}
}
}
}
}
}
else {
completion(result: nil)
}
}.resume()
}
}
Вызов:
Currency.getExchangeRate(baseCurrency: "USD", foreignCurrency: "EUR") { (result) -> Void in
if let exchangeValue = result {
print(exchangeValue)
}
}
Вы довольно близки к своему типу, проблема в том, что машинопись не будет делать никакого вывода о переменных. Если вы установите тип в аннотации типа переменной, то это будет последний тип.
Для получения необходимого поведения вы должны использовать функцию. Функции могут иметь дополнительные параметры типа, которые компилятор выведет на основе фактического типа параметра:
interface IExample<Model extends Record<string, any>> {
model: () => Model,
evaluator: Record<string, (this: Model) => boolean>
}
function createExample<T>(o: IExample<T>) {
return o;
}
const example = createExample({
model: () => ({
k1: true,
k2: 'some content',
k3: [1, 2, 3]
}),
evaluator: {
testEvaluator: function () {
// this is { k1: boolean; k2: string; k3: number[]; }
return this.k1 === true
}
}
});