Программирование
ChatGPT для Swift: 5 лучших промптов для генерации кода
Использование ChatGPT для генерации кода на Swift может значительно повысить вашу производительность. Хотя я не уверен, что ИИ займет место разработчиков, я уверен, что разработчики, не знающие, как использовать ИИ в своих интересах, станут писать код гораздо медленнее.
Сегодня мы рассмотрим несколько моих любимых способов использования ChatGPT для ускорения процесса разработки. Задавая правильные вопросы, вы сможете получить на выходе код, близкий к тому, что вы, скорее всего, ищете. Даже если результат не всегда будет идеальным, это уже шаг в правильном направлении. Давайте приступим!
Общие советы по использованию ChatGPT в Swift
Прежде чем мы перейдем к рассмотрению моих 5 любимых подсказок для ChatGPT, важно рассказать об основных принципах. ChatGPT — это чат-бот с искусственным интеллектом, который будет пытаться ответить на ваши вопросы. Вопрос называется подсказкой (промптом) и может быть любым. Я часто удивляюсь, когда вижу качественный ответ, хотя заранее думал: «Он никак не может на это ответить».
Для начала можно зайти на сайт chatgpt.com и создать учетную запись. Войдя в систему, вы можете начать задавать вопросы, введя свой вопрос. Например, мы можем спросить: «Когда Apple анонсировала Swift?».
Видно, что он отлично справился с ответом на вопрос!
Для вопросов, связанных с кодом, я придерживаюсь нескольких правил, которые помогут вам получить полезные ответы:
- Упомяните, что вы пишете код на Swift.
- Предоставьте любой контекст, который у вас есть (например, предысторию, связанный код, определения протоколов или перечислений и т д.)
- Не сомневайтесь и всегда спрашивайте. Лучше попробовать и получить неправильный ответ, чем заранее предсказать, сможет ли он ответить на ваш вопрос. Вы часто будете удивлены.
- Всегда проверяйте выходной код на наличие ошибок. ИИ отлично справляется со своей работой, но часто в нем встречаются ошибки или устаревший код.
Учитывая это, давайте рассмотрим 5 моих любимых подсказок при разработке приложений на Swift.
1. Создание структур для заданного JSON
Первая подсказка поможет вам сгенерировать код для заданного JSON. Подсказка выглядит следующим образом:
Can you write a Swift struct called Person for the following JSON [JSON]
Результатом будет полезная структура, соответствующая протоколу Codable. Если вы новичок в декодировании JSON в Swift, прочитайте статью “Парсинг JSON в Swift с примерами кода”. В ответе будет даже приведен пример, чтобы попробовать сгенерировать код с помощью декодера JSON. Это отличный пример использования ChatGPT для генерации кода в Swift, чтобы ускорить процесс разработки.
2. Написание модульных тестов для заданного фрагмента кода
Этот вариант часто генерирует больше всего кода из всех подсказок. Также вероятно, что результаты не будут соответствовать вашему стилю кодирования тестов, но это способ быстро начать работу с тестами. Идея заключается в том, чтобы позволить ChatGPT генерировать модульные тесты для заданного фрагмента кода.
Подсказка выглядит следующим образом:
Can you write unit tests in Swift for the following piece of code: [CODE]
Например, мы можем попросить его написать тесты для следующего фрагмента кода:
extension StringProtocol { func uppercasedFirst() -> String { prefix(1).uppercased() + dropFirst() } }
Вывод довольно подробный, в общей сложности пять различных юнит-тестов:
class StringProtocolExtensionsTests: XCTestCase { func testUppercasedFirst_withEmptyString() { let emptyString = "" XCTAssertEqual(emptyString.uppercasedFirst(), "") } func testUppercasedFirst_withSingleCharacter() { let singleCharacter = "a" XCTAssertEqual(singleCharacter.uppercasedFirst(), "A") let singleCharacterUpper = "A" XCTAssertEqual(singleCharacterUpper.uppercasedFirst(), "A") } func testUppercasedFirst_withMultipleCharacters() { let multipleCharacters = "hello" XCTAssertEqual(multipleCharacters.uppercasedFirst(), "Hello") let multipleCharactersMixed = "hELLO" XCTAssertEqual(multipleCharactersMixed.uppercasedFirst(), "HELLO") let multipleCharactersUpper = "HELLO" XCTAssertEqual(multipleCharactersUpper.uppercasedFirst(), "HELLO") } func testUppercasedFirst_withWhitespaceAndSpecialCharacters() { let stringWithWhitespace = " hello" XCTAssertEqual(stringWithWhitespace.uppercasedFirst(), " hello") let stringWithSpecialCharacter = "$hello" XCTAssertEqual(stringWithSpecialCharacter.uppercasedFirst(), "$hello") let stringWithNumber = "1hello" XCTAssertEqual(stringWithNumber.uppercasedFirst(), "1hello") } func testUppercasedFirst_withUnicodeCharacters() { let unicodeString = "éclair" XCTAssertEqual(unicodeString.uppercasedFirst(), "Éclair") let unicodeStringUpper = "Éclair" XCTAssertEqual(unicodeStringUpper.uppercasedFirst(), "Éclair") } }
Как видите, вы можете прекрасно использовать ChatGPT для генерации юнит-тестов Swift.
2.1 Бонус: генерация моков
Этот небольшой бонусный совет также связан с тестами и вы можете попросить ChatGPT сгенерировать Swift-код для заданного протокола. Запрос выглядит следующим образом:
Generate a Swift mock for the following protocol: [CODE]
Например, создание заглушки для следующего протокола:
protocol AppVersionProviding { var currentVersion: String { get } }
В результате получается следующий код:
class MockAppVersionProvider: AppVersionProviding { var currentVersion: String init(currentVersion: String) { self.currentVersion = currentVersion } }
Довольно простой, но вполне применимый и достаточно хороший код для юнит-тестов.
3. Конкретные вопросы по коду
Использование ChatGPT для генерации Swift-кода полезно в самых разных случаях. Третья подсказка — это не конкретная подсказка, а скорее общий совет задать ChatGPT любые вопросы по программированию, которые у вас могут возникнуть.
Например, недавно я спросил ChatGPT, как получить 95-й процентиль для заданного массива временных интервалов, чтобы использовать его в RocketSim Xcode Build Insights:
I have an array of timeintervals in Swift. How can I generate the 95th percentile?
Сгенерированный код выглядит следующим образом:
import Foundation extension Array where Element == TimeInterval { func percentile95() -> TimeInterval? { guard !self.isEmpty else { return nil } let sortedArray = self.sorted() let index = Int(Double(sortedArray.count) * 0.95) // Ensure the index is within bounds let percentileIndex = min(index, sortedArray.count - 1) return sortedArray[percentileIndex] } } // Usage example let timeIntervals: [TimeInterval] = [1.0, 2.0, 0.5, 1.5, 2.5, 3.0, 0.25] if let percentile95 = timeIntervals.percentile95() { print("95th percentile is \(percentile95)") } else { print("Array is empty") }
К нему прилагается подробное описание:
Explanation: - The percentile95 method is an extension on Array where the element type is TimeInterval. - It first checks if the array is empty and returns nil if so. - The array is sorted in ascending order. - The index for the 95th percentile is calculated as 95% of the total count. - We use min(index, sortedArray.count - 1) to ensure the index is within the bounds of the array. - Finally, the value at the calculated index is returned. This function correctly handles arrays of TimeInterval values and calculates the 95th percentile. Note that if the array length is small, the 95th percentile may be the highest value due to rounding
Другими словами, ChatGPT может стать вашим знающим коллегой, к которому всегда можно обратиться с вопросами. Возможно, полученный код не всегда будет соответствовать вашим стандартам, но это отличная отправная точка для продолжения. Сначала сделайте так, чтобы это работало, а затем сделайте так, чтобы это блистало!
4. Добавление документации
Мы, разработчики, любим писать код, но часто не любим писать подробную документацию. А жаль, ведь это отличный способ поднять уровень вашей кодовой базы и сделать ее доступной для коллег, которые будут смотреть ваш код.
Хотя мы уже использовали ChatGPT для генерации Swift-кода в других заданиях, теперь мы будем использовать его для генерации документации:
The following code does [EXPLANATION]. Can you write documentation for the following piece of Swift code: [CODE]
Рекомендуется давать некоторые пояснения, чтобы ChatGPT знал, что делает ваш код. Однако я слышу, как вы думаете: «В таком случае, наверное, будет быстрее написать документацию самому».
Вы правы, так что попробуйте следующую подсказку и посмотрите, достаточно ли удовлетворителен результат:
Can you write documentation for the following piece of Swift code: [CODE]
В качестве примера я попросил его сгенерировать документацию для довольно простого метода обработки строки, который мы использовали ранее. Результат выглядит следующим образом:
extension StringProtocol { /// Returns a new string with the first character uppercased and the remaining characters unchanged. /// /// This method uppercases only the first character of the string and leaves the rest of the characters unchanged. /// If the string is empty, it returns an empty string. /// /// - Returns: A string with the first character uppercased, or an empty string if the original string is empty. /// /// # Examples: /// ``` /// print("hello".uppercasedFirst()) // "Hello" /// print("Hello".uppercasedFirst()) // "Hello" /// print("".uppercasedFirst()) // "" /// print("a".uppercasedFirst()) // "A" /// print("1hello".uppercasedFirst()) // "1hello" /// print(" élève".uppercasedFirst()) // " Élève" /// ``` func uppercasedFirst() -> String { // Check if the string is empty guard let firstCharacter = first else { return "" } // Uppercase the first character and concatenate with the rest of the string return String(firstCharacter).uppercased() + dropFirst() } }
Получившаяся документация очень подробна и, скорее всего, намного больше, чем вы могли бы написать. Избыточна ли эта документация? Зависит от ваших предпочтений, но вы всегда можете оставить ту часть, которая вам нужна.
5. Предложения по улучшению кода
Последняя подсказка использует ChatGPT для улучшения кода Swift. Возможно, вы написали код, который работает, но кажется, что его можно было бы оптимизировать.
Например, я написал следующий фрагмент кода, чтобы получить первый контакт в массиве для заданного запроса:
extension [Contact] { func findFirstContact(for query: String) -> Contact? { filter { contact in contact.name.contains(query) } .first } }
Код работает и, возможно, выглядит неплохо, но я все же решил попросить ChatGPT об улучшениях. Вывод выглядит следующим образом:
extension Array where Element == Contact { /// Finds the first contact whose name contains the query string. /// The search is case insensitive and ignores leading/trailing whitespace in the query. /// /// - Parameter query: The query string to search for. /// - Returns: The first contact whose name contains the query string, or `nil` if no contact is found. func findFirstContact(for query: String) -> Contact? { // Trim whitespace from the query and check if it's empty let trimmedQuery = query.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmedQuery.isEmpty else { return nil } // Perform a case-insensitive search return first { contact in contact.name.range(of: trimmedQuery, options: .caseInsensitive) != nil } } } // Assuming Contact is defined like this: struct Contact { let name: String } // Usage example let contacts = [Contact(name: "Alice Johnson"), Contact(name: "Bob Smith"), Contact(name: "Charlie Brown")] if let contact = contacts.findFirstContact(for: "bob") { print("Found contact: \(contact.name)") // Output: Found contact: Bob Smith }
ИИ улучшил код и добавил документацию и пример, чтобы опробовать оптимизированный метод. ChatGPT также поделился ключевыми улучшениями, которые он сделал:
- Производительность: Использование first(where:) останавливается на первом совпадении.
- Нечувствительность к регистру: Поиск теперь не зависит от регистра.
- Обработка пробелов: Обрезка запроса для предотвращения проблем со случайными пробелами.
- Документация: Добавлены комментарии для ясности.
Эти изменения делают функцию более надежной и эффективной и показывают, как использовать ИИ для оптимизации существующего кода.
Заключение
ChatGPT для генерации кода Swift — отличный способ повысить производительность. Важно предоставить достаточно контекста, чтобы чат-бот мог давать ценные ответы, но если вы потратите на это время, то, скорее всего, будете писать код гораздо быстрее.
Спасибо!