2017-01-20 2 views
4

У меня есть код. Я не понимаю, что происходит внутри этого кода. Может кто-нибудь объяснить это?Массивный фильтр в Swift3

let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] 

     let res = wordFreqs.filter(
     { 
      (e) -> Bool in 

      if e.1 > 3 { 
       return true 
      } else { 
       return false 
      } 

     }).map { $0.0 } 

     print(res) 

дает выход:

["k","a"] 
+1

Простой, сначала ваш массив был отфильтрован _ (по значению> 3) _, а затем отображен _ (для ключа) _, вы можете узнать больше о Swift язык из книги Apple. – holex

+0

Если у кого-то есть проблема с моим вопросом. Пожалуйста, дайте комментарий, а не только отрицательную оценку. – Amanpreet

+0

Я бы подумал, что это простой вопрос, потому что это очень простой вопрос, на который можно ответить, читая первые несколько страниц бесплатной книги Swift, выпущенной Apple. Задавая этот вопрос, здесь возникает недостаток усилий, направленных на понимание кода перед тем, как его спросить. (Не мое голосование, хотя. Просто, чтобы быть ясным.) – Fogmeister

ответ

10

Если мы возьмем части этого кода, один за другим:

let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] 

Вы начинаете с массивом кортежей ,

Из Свифт документации:

Тип кортеж является разделенный запятыми список типов в круглых скобках.

и:

группы Кортежи несколько значений в одно значение соединения. Значения в кортеже могут быть любого типа.

В этом случае кортежи являются «парами» из двух значений, одного из типов String и 1 типа Int.


 let res = wordFreqs.filter(
     { 
      (e) -> Bool in 

Эта часть применяет фильтр на массиве. Вы можете видеть здесь, что закрытие фильтра принимает элемент e (так, в нашем случае, один кортеж) и возвращает Bool. С помощью функции «фильтр» возвращение true означает сохранение значения, а возврат false означает его фильтрацию.


  if e.1 > 3 { 
       return true 
      } else { 
       return false 
      } 

e.1 синтаксис возвращает значение кортежа по индексу 1. Таким образом, если значение кортежа с индексом 1 (второй) составляет более 3, фильтр возвращает истину (так кортеж будут сохранены); если нет, фильтр возвращает false (и, следовательно, исключает кортеж из результата). В тот момент, результат фильтра будет [("k", 5), ("a", 7)]


 }).map { $0.0 } 

Функция карты создает новый массив на основе массива кортежа: для каждого элемента входного массива ($ 0), она возвращает значение кортежа индекс 0. Таким образом, новый массив ["k", "a"]


 print(res) 

Это выводит результат на консоль.


Эти функции (фильтр, карта, сокращение и т. Д.) Очень распространены в функциональном программировании. Они часто связаны цепью с использованием точечного синтаксиса, например [1, 2, 3].filter({ }).map({ }).reduce({ })

+0

Спасибо за ваше объяснение! – Amanpreet

+1

С удовольствием! Я все еще добавляю несколько деталей, чтобы сделать его еще более понятным. –

+0

Если один из ответов вам подходит, не могли бы вы отметить его как принятый ответ? благодаря –

1

wordFreqs является массив tuple.

Кортежи

Кортеж представляет собой группу из нуля или более значений, представленных в виде одного значения.

Например («Джон», «Смит») содержит имя и фамилию человека. Вы можете получить доступ к внутренним значению, используя точку записи с последующим индексом значения (.):

var person = ("John", "Smith") 

var firstName = person.0 // John 
var lastName = person.1 // Smith 

Теперь в вашем случае у вас есть кортеж типа (String, Int) и filter вы сравниваете e.1 > 3 (Здесь e является имеет значение кортежа из итерации массива с filter) означает, что то будет second(Int) значение больше чем 3.

Теперь после этого вы используете map на filter результат и просто перенастройки на String($0.0) из кортежа.

//array of tuples 
    let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] 

    let res = wordFreqs.filter(
    { 
     (e) -> Bool in 
     //Comparing the Second Int value of tuple in filter 
     if e.1 > 3 { 
      return true 
     } else { 
      return false 
     } 

    }) 
    //Mapping the result of filter 
    .map { 
     //return the String from the tuple 
     $0.0 
    } 
+0

Ницца! И что здесь «е»? И когда я запускаю код, он не войдет внутрь метода фильтра. Зачем? – Amanpreet

+0

@Amanpreet Проверьте оператор скобки в моем ответе: 'e.1> 3 (Здесь e имеет значение кортежа из итерации массива с фильтром)' –

+0

@Amanpreet То же самое относится и к «карте», но в этом месте он использует '$ 0'. –

8
// this creates an array of tuples 
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] 

let res = wordFreqs.filter { 
    (e) -> Bool in 

    // this filters the array 
    // it removes any items that have the second part of the tuple 
    // of 3 or less 
    if e.1 > 3 { 
     return true 
    } else { 
     return false 
    } 
}.map { 
    // this "maps" the array and returns the first part of the tuple 
    $0.0 
} 

print(res) 

Примечание ... если я пишу это, я бы сократить его на что-то вроде ...

let res = wordFreqs.filter { $0.1 > 3 } 
        .map { $0.0 } 
+0

Спасибо !!!!!!!!!!!!!!!!!!! – Amanpreet

1

Ваш e объект, представляющий (String, int) тип. Как вы можете видеть в массиве внутри [("k", 5), ("a", 7), ("b", 3)].

Прежде всего вы используете метод filter, поэтому вам нужно вернуть true или false значения. В этом случае вы проверяете, является ли e.1 (значение int value) больше 3, если вы не вернете false. После всего этого процесса метод filter возвращает отфильтрованный массив объектов (String, int).

Следующий шаг map функция. В вашем случае это просто отображение всех значений массива в первый объект вашего кортежа (String, int).

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

let filteredArray = wordFreqs.filter 
({ 
    (e) -> Bool in 
    return e.1 > 3 
})// the filteredArray is [("k", 5), ("a", 7)] 


let finalValue = filteredArray.map { 
    $0.0 
}// here you're creating a new array with String. $0 represents object from filteredArray 

print(finalValue) // ["k", "a"] 
+0

Спасибо. Теперь я понимаю концепцию. – Amanpreet

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