2015-12-30 4 views
0

От here я вижу, что собственно Alamofire 2/Swift 2 синтаксис при работе с ответом JSON является:Как «пусть JSON» работать в Alamofire/Swift

Alamofire.request(.GET, URLString, parameters: ["foo": "bar"]) 
.responseJSON { request, response, result in 
    switch result { 
    case .Success(let JSON): 
     print("Success with JSON: \(JSON)") 

    case .Failure(let data, let error): 
     print("Request failed with error: \(error)") 

     if let data = data { 
      print("Response data: \(NSString(data: data, encoding: NSUTF8StringEncoding)!)") 
     } 
    } 
} 

Как и где let JSON определяется? (Из Свифт точки зрения.)

я вижу в расширении запроса, ResponseSerializer возвращается .Success(JSON) но почему обработчик не определен, как обычная функция:

case .Success(JSON: AnyObject?) { 
    print("Success with JSON: \(JSON)") 
} 

или еще лучше:

case .Success(JSON: NSDictionary?) { 
    print("Success with NSDictionary: \(JSON)") 
} 
+1

нигде не определено, что просто синтаксис для использования перечислений с данными внутри. – luk2302

ответ

2

result является перечислением с футлярами .Success, .Failure. События Enum в Swift могут иметь некоторое значение (кстати, так работают Опционы в Swift, они перечислены с двумя случаями Some: который обертывает значение и None). Вызывая case .Success(let JSON): в коммутаторе, вы назначаете это значение JSON константе, и вы можете использовать его в случае блокировки. Тип этой константы автоматически выводится.

Для получения дополнительной информации об этом, проверьте пункт «связанные значения» в Swift Language Guide

+0

Итак, в основном 'result.value' устанавливается в' JSON'? – boidkan

+0

@boidkan Похож на это, и тип result.value - это значение «Value?», Которое я еще не совсем понял, но похоже на старую оболочку NSValue (?). – owenfi

+0

Вы получаете 'result' как один из аргументов обработчика, который передается как аргумент метода' responseJSON'. 'result' - это перечисление, и вы можете получить доступ к значению, связанному с этим перечислением, с указанным вами синтаксисом. Вы ничего там не устанавливаете. Здесь https://github.com/Alamofire/Alamofire/blob/master/Source/Result.swift вы можете видеть, что на самом деле вызов 'result.value' делает под капотом то же самое, что и в вашем вопросе. –

Смежные вопросы