Какие советы по игре в коде в Swift? Акцент на безопасности, кажется, затрудняет игру в гольф, но это делает маленькие советы и даже более полезными. Существуют ли какие-либо функции в Swift, которые могут помочь ему в определенных видах применения в код-гольфе?
Пожалуйста, оставьте один совет за ответ.
Ответы:
Изменяется
Одна вещь, которая действительно полезна - это создание диапазонов с помощью операторов
...
или..<
Например
Итак, чтобы получить значения со 2 по 4 массива
Практическое использование
С помощью
На 8 байт короче
источник
for n in 0...3{print(a[n])}
не действует?Затворы:
Использование переменных, удерживающих функцию, против использования самой функции может помочь:
65 байт:
66 байт:
Небольшая разница здесь, но она покажет больше в некоторых головоломках.
Укорочение функции:
Глядя на предыдущий пример напоминает мне кое-что. Иногда, если вы будете использовать функцию достаточно много раз, стоит переименовать ее:
Это:
К этому:
Или, собственно, так лучше:
Таким образом, вы просто звоните
r("Hello World",8)
вместоString(repeating:"Hello World",count:8)
Оставляя объявления типов:
Однажды я создал замыкание, не задав тип аргумента, и таким образом создал более короткий ответ:
Компилятор сделал вывод, что
i
вInt
.Создать массивы быстрый путь:
Если вам нужен массив
Ints
, используйтеRange
для его создания:Это делает то же самое, что и:
Массивы вместо
If
илиSwitch
:Вместо этого:
Вы, вероятно, можете сделать это:
Укороченные типы:
Если вы часто используете преобразование типов, вы можете создать псевдоним типа:
Карта:
Помните, что вам часто не нужно использовать
return
ключевое слово вmap
функции.Запуск Swift Online:
Хотя Try It Online не поддерживает Swift,он делает это сейчас !источник
try
В Swift 2.x и выше функции, которые традиционно обрабатывали ошибки, передавая указатель на
NSError
объект в качестве параметра функции, теперь являютсяthrow
их ошибкой.Это означает, что это:
теперь выглядит так:
Это можно сократить с помощью
try?
илиtry!
.try?
оценит выражение,nil
если возникнет ошибка.try!
вылетит из программы, если возникнет ошибка, и ее следует использовать только в тех случаях, когда ошибка не возникнет.try?
иtry!
сохранить как минимум 13 байтов изdo-try-catch
цикла. Обратите внимание, что вы также сохраняете по крайней мере еще один байт, передавая пустой массив ([]
) для параметров,nil
а не также.источник
Сокращение Массивов
Итерирование с
for-in loops
помощью массива для получения одного значения, такого как сумма элементов внутри или произведение его элементов, может быть слишком длинным для того, насколько это просто на самом деле. Вы можете просто использоватьreduce()
метод. Некоторые примеры:Добавление элементов в массив с помощью
for-in
циклов:можно упростить до:
И получить произведение элементов внутри массива с помощью циклов for-in:
также может быть уменьшен до:
источник
**
функцию, чем просто вызываяpow
вручную?Тернарный оператор Свифта очень лаконичен:
condition ? action : other
действиеЕсли условие истинно, сделай одно, если нет, то сделай другое.
Это делает
textColor
белый, если фон черный, или черный, если фон любого другого цвета.Оператор слияния ноль еще короче:
a ?? b
Допустим, вы проверяете JSON для определенного ключа, чтобы вы могли представить значение ключа в виде текста заголовка. Если ключ отсутствует (то есть значение равно nil), мы хотим дать заголовок текст по умолчанию.
источник
перечисление
Вы можете цепь
forEach
изenumerated()
по типу коллекции , чтобы получить ссылку на объект (или тип значения) в коллекции, а также его индекс:или
или (даже более короткий
CountableClosedRange
синтаксис)Печать:
источник
Substring
Иногда вы можете сохранять байты, обращаясь к типам Foundation вместо использования чистых типов Swift. Сравните доступ к подстроке
NSString
сString
типом Swift :Даже с 9 символов , потерянных объявляя
x
какNSString
, вы экономите более 25 с помощью типа Foundation, так какsubstringToIndex
принимает вInt
качестве параметраNSString
, по сравнению сIndex
структурой (String.CharacterView.Index
) для SwiftString
типов.Следует отметить, что доступность типов Foundation может различаться на разных платформах (OS X, Linux и т. Д.). Большинство базовых классов находятся
NSUnimplemented
в версии Swift с открытым исходным кодом.источник
.карта()
Сочетание
.map()
с конечным синтаксисом замыкания может затянуть циклы for. Мы можем поместить вещи, которые мы хотим перебрать в массив, а затем использовать.map()
для выполнения некоторых действий с каждым элементом.Например, мы можем использовать
.map()
этот старый каштан Fizzbuzz в одну строку.Вне гольфа,
.map()
может помочь сократить количество повторений. Например, предположим, что у вас есть представление, которое вам нужно позиционировать программно. Вы можете поместить якоря для представления в анонимный массив и запустить.map()
его, чтобы установить для каждого ограничения.isActive
значение true, например, так:источник
forEach
во втором примере?map
действительно должен использоваться для преобразования содержимого массива, а не как ярлык итерации. В этом случае вы отбрасываете результат.Назначение переменных для игры в гольф в структурах потока управления с использованием кортежей
Предположим, вы хотите использовать
while
цикл, и вы хотите использовать одну и ту же вещь как в условии, так и в последующем блоке. Тогда, скорее всего, поможет встроенное назначение в кортеже. Чем дольше ваш атрибут, тем лучше! Учтите это (на 3 байта короче):через это:
Обратите внимание на ту
(i=k.count,i>0).1
часть, которая довольно интересна.Вдохновленный одним из ответов Германа Лауэнштейна .
источник
Повторяющиеся строки
К сожалению, Swift не поддерживает умножение строк с помощью
*
Python. Хороший метод, который вы можете использовать вместо этогоString(repeating:count:)
, но, к сожалению, это не совсем гольф. Сравните эти два подхода:а также
Второй - на пару байтов короче, но его нельзя использовать в замыкании ... Еще лучше, и он также работает в замыканиях:
А что если я сделаю это несколько раз? Ну, вы можете использовать
String.init()
. Теперь это может сэкономить много байтов. Например (68 байт):вместо (74 байта):
или (70 байт):
Но убедитесь, что ваша строка достаточно длинная. Если вы используете
String(repeating:"abc",3)
, гораздо лучше использовать"abcabcabc"
вместо этого.источник
импорт
Вы можете заменить
import Foundation
сimport UIKit
на 5 байт короче, так как UIKit делает импорт Foundation уже.источник