Статьи

8 новых способов изменить ваш код с помощью Swift 4

Оптимизация Swift 4

Swift является одним из самых быстрорастущих языков в истории благодаря своей элегантности, простоте и «безопасности благодаря дизайну». На самом деле официальная мантра Свифта — «сделать программирование простых вещей легким, а трудных — возможным». В этой статье вы узнаете, как использовать Swift в полной мере, путем рефакторинга вашего кода.

Хотя большая часть оптимизации кода является неявной и, очевидно, присущей структуре языка, существуют определенные стратегии рефакторинга, которые могут сделать ваш код более читабельным, более надежным и более производительным. В этой статье вы узнаете восемь способов рефакторинга вашего кода с помощью Swift 4.

В этой статье вы узнаете несколько способов лучшей оптимизации и рефакторинга вашего кода с помощью Swift 4. Мы рассмотрим следующее:

  1. элегантная обработка дубликатов ключей в словарях с помощью zip
  2. установка значений по умолчанию для словарей
  3. объединение словарей в один
  4. фильтрация значений словаря данных непосредственно в другой объект словаря
  5. используя Codable для сохранения пользовательских объектов в JSON
  6. обмен значениями в изменяемых массивах
  7. обработка многострочных литералов
  8. поиск случайных элементов в коллекции

Во-первых, Swift 4 еще больше расширяет словари благодаря элегантному способу обработки дубликатов ключей с помощью универсальной функции zip . zip работает не только со словарями, и фактически он позволит вам создать собственный тип последовательности из двух базовых коллекций, которые соответствуют Sequence.

Например, скажем, у вас есть массив со следующими значениями, принимая к сведению два элемента, содержащие один и тот же ключ:

1
2
let locations = [ «Springfield», «Chicago», «Springfield», «Jackson»]
var dictionary: Dictionary<String, String>

Используя zip , вы можете создать последовательность уникальных пар:

1
2
3
4
5
let locations = [ «Springfield», «Chicago», «Springfield», «Jackson»]
 
var dictionary = Dictionary(zip(locations, repeatElement(1, count: locations.count)), uniquingKeysWith: +)
 
print(dictionary) // [«Jackson»: 1, «Chicago»: 1, «Springfield»: 2]

Элементы uniquingKeysWith в приведенном выше коде позволяют создавать уникальные значения с помощью математического оператора. В этом случае мы используем + для увеличения значения при обнаружении дублирующейся записи. Конечно, вы также можете решить использовать свою собственную логику приращения.

Еще одна мощная функция Swift 4 — возможность устанавливать значения по умолчанию для словарей, используя недавно добавленный нижний индекс. В следующем коде, когда вы получаете доступ к значению ключа в словаре, возвращаемое значение является optional значением, которое вернет nil, если ключ не существует:

1
2
3
let locationsAndPopulations = [ «Springfield»: 115715, «Chicago»: 2705000, «Aurora»: 201110]
print(locationsAndPopulations[«Springfield»]) //value is optional
print(locationsAndPopulations[«New York»]) //this key doesn’t exist, returns nil

Обычно вы должны обрабатывать возможность nil в необязательных значениях, но Swift 4 делает это немного более удобным для вас, благодаря новому нижнему индексу, который позволяет вам добавлять параметры по умолчанию, вместо того, чтобы заставлять вас защищать или развертывать дополнительные параметры.

1
print(locationsAndPopulations[«New York», default: 0])

В этом случае, поскольку у нас нет записи для Нью-Йорка в нашем исходном массиве, он вернет параметр по умолчанию, равный 0. Вы также можете ввести динамическое значение вместо статического литерального значения, если вам нужно, что, безусловно, делает для гораздо более мощной функции индексации.

Swift 4 также облегчает объединение двух словарей в один с помощью функции merge(_:uniquingKeysWith:) . В следующем примере мы объединяем второй словарь с первым, и с помощью недавно изученного параметра uniquingKeysWith мы можем обеспечить обработку любых дубликатов в случае их появления:

1
2
3
4
5
6
var locationsAndPopulationsIL = [ “Springfield”: 115715, “Chicago”: 2705000, “Aurora”: 201110]
 
let location2 = [ “Rockford”: 152871, “Naperville”: 141853, “Champaign”: 81055]
 
locationsAndPopulationsIL.merge(location2, uniquingKeysWith: +)
print(locationsAndPopulationsIL)

В отсутствие этой функции вам обычно приходится вручную обходить все значения словаря и реализовывать пользовательскую логику, объединяя два словаря в один.

Помимо объединения двух словарей, вы также можете динамически фильтровать словарь с результатами, направленными обратно в другой словарь того же типа. В следующем фрагменте кода мы фильтруем словарь местоположений по определенному значению, возвращаемому как словарь:

1
2
3
4
5
let locationsAndPopulationsIL = [ «Springfield»: 115715, «Chicago»: 2705000, «Aurora»: 201110]
 
let filteredmillionPlusPopulation = locationsAndPopulationsIL.filter{ $0.value > 1000000 }
 
print(filteredmillionPlusPopulation) //[«Chicago»: 2705000]

Таким образом, помимо простой фильтрации, вы также можете использовать закрытие filter для предоставления пользовательских фильтров, которые завершатся новым результатом словаря.

Если вы когда-либо сериализовали (и десериализовали) данные раньше, это может быть довольно NSCoding подкласс классов с помощью NSObject , а также реализовать NSCoding . С Swift 4 вы можете более эффективно сериализовать свои классы с помощью Codable . Это особенно полезно, когда вы хотите сохранить данные путем сериализации своего собственного объекта в объект JSON, либо для передачи в API, либо даже для локального UserDefaults с использованием UserDefaults :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// a class to serialize
class Location: Codable{
    var name: String
    var population: Int
     
    init(name: String, population: Int){
        self.name = name
        self.population = population
    }
}
 
//create an instance
let chicago = Location(name: «chicago», population: 2705000)
 
//serialize to JSON
let jsonData = try?
 
//deserialize and output
if let data = jsonData{
    let jsonString = String(data: data, encoding: .utf8)
    print(jsonString!) //{«name»:»chicago»,»population»:2705000}
 
}

Как вы можете видеть, установив для вашего класса или структуры Codable , вы можете легко сериализовать ваши данные в JSON, сохранить их где-нибудь и десериализовать обратно.

Переключение на массивы — еще одна полезная особенность Swift 4 — возможность поменять два значения непосредственно в изменяемых массивах с помощью swapAt(_:_:) . Это было бы наиболее полезно для таких функций, как алгоритмы сортировки, и его чрезвычайно просто использовать:

1
2
3
4
var locations = [ «Springfield», «Chicago», «Champaign», «Aurora»]
 
locations.swapAt(0, 2)
print(locations) //[«Champaign», «Chicago», «Springfield», «Aurora»]

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

Еще одним интересным дополнением к Swift 4 является возможность хранить многострочные строковые литералы в ваших значениях, что позволяет чрезвычайно легко выделить ваш литеральный контент, чтобы сделать его более презентабельным. Используя обозначение """ чтобы открывать и закрывать текстовый блок, вы можете создавать многострочный контент и даже ссылаться на динамические переменные, как показано ниже, когда мы динамически добавляем дату.

01
02
03
04
05
06
07
08
09
10
let illinoisIntro = «»»
Illinois is a state in the Midwestern United States.
populous and 25th largest state, and is often noted as a microcosm of
the country.
cities and great agricultural productivity in central and northern Illinois,
and natural resources like coal, timber, and petroleum in the south, Illinois
has a diverse economic base and is a major transportation hub.
(Source: Wikipedia — Dated \(Date())
«»»
print(illinoisIntro)

В Swift 4.2 появилась возможность выбирать случайные элементы в коллекции с randomElement функции randomElement . Фактически, не только массивы, но и любой объект, который соответствует протоколу Collection , может использовать эту изящную функцию. В следующем примере используется наш массив местоположений, и он выведет случайный город из этого массива:

1
2
3
4
let locations = [ «Springfield», «Chicago», «Springfield», «Jackson»]
 
let randomElement = locations.randomElement()
print(randomElement!)

В этой статье вы узнали о некоторых полезных методах, которые Swift 4 предлагает для создания более компактного, целенаправленного и оптимизированного кода. В своей четвертой итерации Swift, безусловно, добилась успехов, помогая вам реорганизовать код, чтобы сделать его более читабельным и надежным. Swift 4.x еще не закончен, и я призываю вас перейти на официальную страницу развития Swift, чтобы принять к сведению все новые предложения, которые предстоит обсудить.