2016-06-10 9 views
2

У меня есть следующая функция в карри, и я получил предупреждение XCode о том, что Синтаксис Curried будет удален в будущей версии Swift; используйте один список параметров, но предлагаемое исправление не работает (оно просто объединяет параметры в один вызов функции). Я пытаюсь преобразовать в новый формат, но я не понимаю, как это работает. Функция beginFetchWithCompletionHandler ниже ожидает, что handleDownload имеет подпись параметра (data : NSData?, error : NSError?).Невозможно перевести Swift 2.2 currying в будущий формат Swift

fetcher.beginFetchWithCompletionHandler(handleDownload) 

Я хочу также передать в целое число, следующим образом:

fetcher.beginFetchWithCompletionHandler(handleDownload(0)) 

Следующая кэрри функция работает отлично (но дает предупреждение):

func handleDownload(iCount : Int)(data : NSData?, error : NSError?) -> Void { 
    print(iCount) 
    print(data!.length) 
} 

Вот что я «Пробовал, но получаю ошибку:« Выражение разрешается для неиспользуемой функции »:

func handleDownload2(iCount:Int) -> (NSData?, NSError?) -> Void { 
    return { (data: NSData?, error: NSError?) -> Void in { 
      // received image 
      print(iCount) 
      print(data!.length) 
     } 
    } 
} 

ответ

1

Внутренние фигурные скобки не правы, это должно быть:

func handleDownload2(iCount:Int) -> (NSData?, NSError?) -> Void { 
    return { (data: NSData?, error: NSError?) -> Void in 
     // received image 
     print(iCount) 
     print(data!.length) 
    } 
} 
+0

Работает отлично. Благодаря! –

0

Свифта Evolution Предложения SE-0002 - Removing currying func declaration syntax, которое было принято сказано:

Снимает поддержку нескольких шаблонов аргументов в func декларациях, уменьшая грамматики для func-signature, чтобы разрешить только один пункт argument. Для целей миграции, существующий код, использующий Карринг синтаксис декларации может быть преобразована в явном виде вернуть замыкание вместо:

// Before: 
    func curried(x: Int)(y: String) -> Float { 
    return Float(x) + Float(y)! 
    } 

    // After: 
    func curried(x: Int) -> (String) -> Float { 
    return {(y: String) -> Float in 
     return Float(x) + Float(y)! 
    } 
    } 

Таким образом, ответ дается Martin R для того, чтобы решить, что ваш код правильно:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void { 
    return { (data: NSData?, error: NSError?) -> Void in 
     // received image 
     print(iCount) 
     print(data!.length) 
    } 
} 

Заметим, однако, что вы можете быть более кратким:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void { 
    return { (data, error) in 
     // received image 
     print(iCount) 
     print(data!.length) 
    } 
} 

Здесь тип data и error неявно определяется типом возвращаемого вашей handleDownload2 функции: (NSData?, NSError?) -> Void.


Хотя я бы не рекомендовал его для вопросов читаемости, ваш код может быть еще более кратким, используя shorthand argument names:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void { 
    return { 
     // received image 
     print(iCount) 
     print($0!.length) 
    } 
} 

Кроме того, я иногда стараюсь быть явным, когда я использую замыкание так как это помогает мне быстро установить правильный тип возврата для них:

func handleDownload2(iCount: Int) -> (NSData?, NSError?) -> Void { 
    let innerBlock: (NSData?, NSError?) -> Void = { (data, error) in 
     // received image 
     print(iCount) 
     print(data!.length) 
    } 
    return innerBlock 
}