2016-02-17 2 views
0

Привет всем Я изучаю Swift, просто просматривая книгу, предоставленную Apple в магазине приложений. На странице 21 есть какой-то код, и для жизни я не могу заставить его работать. Просто подумал, может ли кто-нибудь пролить свет. Я уверен, что это обновление, но если кто-то может указать мне или помочь, это будет здорово. Вот код, взятый из книги (да я перепечатанные точно)Быстрая ошибка кода страница 21

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { 
    for item in list { 
     if condition(item) { 
      return true 
     } 
    } 
    return false 
} 
func lessThanTen(number: Int) -> Bool { 
    return number < 10 
} 
var numbers = [20, 19, 7, 12] 

hasAnyMatches(numbers, condition: lessThanTen) 

Однако, когда я положил код в нем изменяет его и показывает условие ARG в вызове функции, как показано ниже. Я должен указать, что я поставил вопросительный знак после условия: поскольку я не уверен, что запрашивает тип данных Int -> Bool.

I have placed a question mark after condition as I am not entirely sure what Int -> Bool is asking for.

+0

Майк, вам нужно ввести число после условия слова, то оно скажет вам, если ваш номер меньше цифр в его списке? – user3069232

+0

Обратите внимание также, что для вопросов здесь, на SO, вы должны публиковать код в блоках кода (см. Мое редактирование), а не размещать изображения кода. – dfri

+0

Какую версию XCode вы используете? На моей стороне с XCode 7.2.1 это работает. –

ответ

1

Тип Int -> Bool является функцией типа, который принимает один аргумент типа Int, и возвращает значение типа Bool. В этом смысле hasAnyMatches является функцией более высокого порядка, поскольку она ожидает в дополнение к целочисленному массиву функцию в качестве аргумента. Следовательно, вы можете отправить, например. ссылку на функцию (на функцию (Int) -> Bool) или замыкание в качестве второго аргумента hasAnyMatches).

Ниже приведен пример, вызывающий hasAnyMatches с 1. ссылкой на функцию; 2. анонимное закрытие; 3. предопределенное закрытие:

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { 
    for item in list { 
     if condition(item) { 
      return true 
     } 
    } 
    return false 
} 
func lessThanTen(number: Int) -> Bool { 
    return number < 10 
} 
var numbers = [20, 19, 7, 12]  

/* 1. function reference: to 'lessThanTen' function */ 
hasAnyMatches(numbers, condition: lessThanTen) 

/* 2. anonymous (trailing) closure: (Int) -> Bool: "integer less than 0?" */ 
hasAnyMatches(numbers) { myInteger in myInteger < 0 } 
hasAnyMatches(numbers) { $0 < 0 } /* short form */ 

/* 3. pre-defined closure: (Int) -> Bool: "integer larger than 0?" */ 
let myIntToBoolClosure : (Int) -> Bool = { 
    myInteger in 
    return myInteger > 0 
} 
hasAnyMatches(numbers, condition: myIntToBoolClosure) 
+0

Спасибо @dfri Я просто разбираюсь с закрытием в Swift. Мне нравится Swift, я очень впечатлен этим. Это отличный ответ. – Mike

+0

@Mike Happy, чтобы помочь, и добро пожаловать в Swift! Я согласен, что это очень аккуратный язык; среди многих аспектов функционального программирования. Для справок в будущем, в контексте задаваемых вопросов здесь, в StackOverflow: обратите внимание, что вы можете включать в себя блоки кода (например, выше) при публикации вопросов, а не образ вашего кода. Вы просто вставляете свой код в свой вопрос; выбирает код и после этого нажимает маленькую кнопку '{}' code block, доступную в верхней части редактора вопросов. Удачи в вашем быстром путешествии! – dfri

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