Readline swift как использовать
Перейти к содержимому

Readline swift как использовать

  • автор:

Как правильно пользоваться опциональными типами данных в условных операторах и циклах в Swift?

Вероятно авторы языка, стремясь к ясности и однозначности, разграничили в конструкции с while операции сравнения и присваивания.

То есть, используя только while , вы либо осуществляете присваивание переменной в цикле (при этом проверка на nil производится автоматически и не может быть произведена явно)

while var text = readLine() < //тело цикла >

Либо осуществляете проверку на nil

while (readLine() != nil) < //тело цикла >

Если вы хотите использовать сложные условия с присваиванием, то предлагается использовать специальную конструкцию while case , тогда ваше условие можно переписать так (и да, здесь будет бесконечный цикл)

while case var text = readLine(), true < //тело цикла >

readLine(strippingNewline:)

Returns a string, read from standard input through the end of the current line or until EOF is reached.

Is the only way to read inputs while doing Coding tests. Let’s try to understand this function to read values of String(s) or Number(s) or Arrays from test inputs.

readLine() which reads one line of user input (everything until they hit return) and sends it back to you.

Let’s read input as String value

guard let name = readLine() else < fatalError("Bad input") >// coding window doesnt support return
print(name) // prints input ex: hello

//Let's read input as Multiple Strings
guard let nameS = readLine(),
let names = nameS.split(separator: " ").compactMap < String($0) >else
print(names) // "A B" -> ["A", "B"]

Let’s read input as Numbers value

guard let numS = readLine(), let number = Int(numS) else < fatalError("Bad input") >// coding window doesnt support return
print(number) // "10" -> 10
//Let's read input as Integers array 
let numbers = readLine()!.split(separator: " ").compactMap
print(numbers) // "1 2" -> [1, 2]

Additional: Filehandle

let stdout = ProcessInfo.processInfo.environment["OUTPUT_PATH"]!
FileManager.default.createFile(atPath: stdout, contents: nil, attributes: nil)
let fileHandle = FileHandle(forWritingAtPath: stdout)!
guard let numS = readLine(), let number = Int(numS) else < fatalError("Bad input") >// coding window doesnt support return
fileHandle.write(String(number).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)

Note: it’s possible for users to enter no input, which is different from an empty string. This means readLine() returns an optional string when you call it, where nil is used to represent «no input».

That’s it. Thank you for reading. Enjoy your coding and all the best for your Coding test

Консольное приложение «Сумма двух чисел» под macOS

Доработайте программу «Сумма чисел» так, чтобы она производила проверку значений запрашиваемых параметров на соответствие числовому типу данных. Программа должна просить ввести корректное значение до тех пор, пока оно не будет введено. И так для каждого из аргументов.

Для решения поставленной задачи вы можете использовать оператор повторения repeat while
Правильный ответ

Функция Int(_:) возвращает значение опционального типа Int? . В случае, если приведение к числу невозможно, будет возвращен nil . Этой особенностью можно воспользоваться при определении соответствия введенных чисел целочисленному типу данных

//запрос первого аргумента var num1: String? repeat < print("Введите числовое значение первого аргумента") num1 = readLine() >while Int(num1!) == nil //запрос второго аргумента var num2: String? repeat < print("Введите числовое значение второго аргумента") num2 = readLine() >while Int(num2!) == nil //подсчет суммы аргументов var result = sum(num1, num2) //вывод результата на консоль print("Результат сложения - \(result)")

Задание 2

Доработайте программу таким образом, чтобы она позволяла выбирать, какую из арифметических операций выполнить (/, *, +, -, корень, степень)

Правильный ответ

Задание 3

Доработайте программу таким образом, чтобы появлялся запрос количества аргументов (будьте внимательны, что для возведения в степень и корня количество аргументов фиксировано)

Правильный ответ

17 Comments

нужно ли корить себя за то, что я два дня думал над первым заданием, пробовал, перечитывал главу с repeat while и в итоге не смог? Пришлось поглядывать в ответ…

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

Спасибо за ответ)
Я тут решил Задание 2, но пока не разобрался с корнем и степенью func sum(_ a: String?, _ b: String?) -> Int print(«Введите нужный знак для арифметической операции +,-,*,/»)
let x = readLine()
var yes = Int()
switch x case «+»:
yes = Int(a!)! + Int(b!)!
case «-«:
yes = Int(a!)! — Int(b!)!
case «*»:
yes = Int(a!)! * Int(b!)!
case «/»:
yes = Int(a!)! / Int(b!)!
default:
print(«Введен неверный знак»)
>
return yes
> Хотел подглядеть, но скачивая вариант Тимура, не могу его открыть, архивы множатся при каждом нажатии. Как его открыть?

ответ для второго задания баганный((( Перезалейте, пожалуйста

Задание 2 (ответ):
//изменения внес только в файл func.swift func sum(_ a: String?, _ b: String?) -> Int print(«Введите нужный знак для арифметической операции +, -, *, /, x^n, sqrt(корень для первого аргумента)»)
let x = readLine()
var yes = Int()
switch x case «+»:
yes = Int(a!)! + Int(b!)!
case «-«:
yes = Int(a!)! — Int(b!)!
case «*»:
yes = Int(a!)! * Int(b!)!
case «/»:
yes = Int(a!)! / Int(b!)!
case «x^n»:
yes = Int(pow(Double(Int(a!)!),Double(Int(b!)!)))
case «sqrt»:
yes = Int(sqrt(Double(Int(a!)!)))
default:
print(«Введен неверный знак»)
>
return yes
>

Задание 3:
// код из main.swift print(«Введите количество аргументов (для x^ — 2шт, для sqrt — 1шт)»)
var countArg = readLine()
var arrayNum = [Int]()
while arrayNum.count Int print(«Введите нужный знак для арифметической операции +, -, *, /, x^n, sqrt(корень для первого аргумента)»)
let x = readLine()
var yes = Int()
switch x case «+»:
yes = a.reduce(0, +)
case «-«:
yes = a.reduce(0, -)
case «*»:
yes = a.reduce(1, *)
case «/»:
yes = a.reduce(1, /)
case «x^»:
yes = Int(pow(Double(a[0]),Double(a[1])))
case «sqrt»:
yes = Int(sqrt(Double(Int(a[0]))))
default:
print(«Введен неверный знак»)
>
return yes
> // Буду благодарен, если разберете мой код, оптимизируете
// Не могу понять, почему приходится отнимать единицу в (Int(countArg!)! — 1)

Задание 3 (в прошлый раз криво залилось, сорян):
// код из main.swift print(«Введите количество аргументов (для x^ — 2шт, для sqrt — 1шт)»)
var countArg = readLine()
var arrayNum = [Int]()
while arrayNum.count Int print(«Введите нужный знак для арифметической операции +, -, *, /, x^n, sqrt(корень для первого аргумента)»)
let x = readLine()
var yes = Int()
switch x case «+»:
yes = a.reduce(0, +)
case «-«:
yes = a.reduce(0, -)
case «*»:
yes = a.reduce(1, *)
case «/»:
yes = a.reduce(1, /)
case «x^»:
yes = Int(pow(Double(a[0]),Double(a[1])))
case «sqrt»:
yes = Int(sqrt(Double(Int(a[0]))))
default:
print(«Введен неверный знак»)
>
return yes
> // Буду благодарен, если разберете мой код, оптимизируете
// Не могу понять, почему приходится отнимать единицу в (Int(countArg!)! – 1)

не заливается полностью((((((((((((
shirokov44007 :

Вижу по дате комента, что ответ мой будет неактуальным для тебя, но все же предположу: если значение будет какое нибудь такое 5.348394 и мы попытаемся представить типом Int, то это будет 6. у меня сейчас проблема в том, что я не могу вытащить корень н-степени с типом данных Double …(

Удалите мои комменты, плиз
Вот ссылка на ответ для 3 задания: https://yadi.sk/d/M_2TZITisN_PQw

Первое задание выполнил с объединением проверки ввода для обоих слагаемых, но пришлось изменить входные параметры функции:
func readNumber () -> Int if let a = Int(readLine()!) <
return a
> else print(«Введите корректное число»)
return readNumber()
>
> print(«Введите значение первого аргумента»)
var a = readNumber() print(«Введите значение второго аргумента»)
var b = readNumber()

Вот основной код всех 3-х заданий: var intFlag = falsevar opFlag = falsevar countFlag = falsevar opCorrectlyFlag = false var op: String?repeat < if opFlag == false < print(«Введите арифметическую операцию») opFlag = true > else < print(«Введите корректную арифметическую операцию») >op = readLine() if op! == «+» || op! == «-» || op! == «*» || op! == «/» || op! == «^2» || op! == «sqrt» < opCorrectlyFlag = true >> while opCorrectlyFlag == false var count: String?repeat < if op == «^2» || op == «sqrt» < count = «1» break > else < if countFlag == false < print(«Введите количество элементов для операции») countFlag = true > else < print(«Введите корректное количество элементов для операции») >> count = readLine()> while Int(count!) == nil var array: Array = []var funcCount = Int(count!)! — 1for i in 0…funcCount < print(«Введите значение аргумента») array.append(readLine()) while Int(array[i]!) == nil < array.removeLast() print(«Введите корректное значение аргумента») array.append(readLine()) >if op == «^2» || op == «sqrt» < break >> let result = sum(array, op)print(«Результат операции: \(result)»)А вот функция: func sum(_ array: Array, _ op: String?) -> Int < var result: Int = 0 switch op! < case «+»: result = 0 for i in 0…funcCount < result += Int(array[i]!)! >case «-«: result = 0 for i in 0…funcCount < if i == 0 < result += Int(array[i]!)! continue > result -= Int(array[i]!)! > case «*»: result = 1 for i in 0…funcCount < result *= Int(array[i]!)! >case «/»: result = 1 for i in 0…funcCount < if Int(array[i]!)! == 0 < continue > if i == 0 < result += Int(array[i]!)! continue > result /= Int(array[i]!)! > case «^2»: result = Int(pow(Double(array[0]!)!, 2)) case «sqrt»: if sqrt(Double(array[0]!)!).truncatingRemainder(dividingBy: 2) != 0 < print(«Ошибка: квадратный корень не может быть извлечён») return 0 > result = Int(sqrt(Double(array[0]!)!)) default: break > return result>Беда в том, что думал над 3-м заданием довольно долго, но, к счастью, смог додуматься ;)P.S. – Извиняйте за чёрный фон

Оуф, что-то совсем всё криво отображается…
julea-parhomova :

2-задание выполнила с использованием словарей (для проверки знака и хранения безымянных функций, их вызова).
Основной файл
import Foundation func insert(print str: String) -> String? var a: String?
repeat print(str)
a = readLine()
>while(Int(a!)==nil)
return a
> var a = insert(print: «Enter value 1: «)
var b = insert(print: «Enter value 2: «) var znaki: [String: (Double, Double) -> Double] = [«/»: , «*»: , «+»: , «-«: , «корень»: , «степень»: ] var zn: String?
repeat print(«Enter sign: «)
zn = readLine()
>while(!znaki.keys.contains(zn!)) let result = operat(a, b, znaki[zn!]!)
print(«Result = \(result)») Второй файл
func operat(_ a:String?, _ b: String?, _ zn: (Double, Double)->Double) -> Double return zn(Double(a!)!,Double(b!)!)
>

nastia_sharf :

Добрый день! У меня случился небольшой ступор: во-первых, данный файл main.swift не отображается в xcode ( его новой версии??)
создавая новый файл для данной программы и делая все, как написано, выкидывает ошибку «expressions are not allowed at the top level»
заварачиваю все в функции — ошибок нет, но не билдится ( может я глупая, но сижу целый день и не могу понять

nastia_sharf :
и в Терминал не выводит (пробовала 2 способа открытия , но не работает)

Добрый вечер. Только что попробовал создать новый проект — файл на месте. Может быть вы выбираете неверный шаблон приложения при его создании? Необходимо macOS — Command Line Tool

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

10 главных конструкций языка Swift

Чтобы быстро начать программировать на языке, достаточно знать несколько основных конструкций и общих правил написания кода. Со временем вы освоите все нюансы, а на старте можно использовать что-то попроще.

Мы уже писали про Swift — что умеет этот язык и для чего он нужен. Теперь посмотрим, из чего он состоит и как можно быстро вникнуть в код на Свифте.

О чём пойдёт речь

�� Мы обещали 10 конструкций, но в итоге получилось 12. Простите 🙂

Переменные

В Swift используют две основных команды:

  1. var — для обозначения переменной;
  2. let — для того, чтобы задать константу.

Тип данных можно не указывать, язык сам разберётся, что к чему:

var myVar = 42
let myConst = 42

Если нужно указать, что переменная должна иметь дробную часть, то делают так:

var myVar: Double = 40

Обратите внимание — Свифт не требует точки с запятой после каждой команды (и не считает ошибкой, если вы их поставите). Но если вы захотите написать несколько команд на одной строке, то точка с запятой понадобится, чтобы отделить одну команду от другой:

var s = 20; let q = ‘string’

Комментарии

Комментарии оформляются так же, как и в JavaScript — двойным слешем:

// привет, это комментарий

Ввод данных с клавиатуры

Чтобы ввести данные с клавиатуры, применяют команду readLine(). С её помощью можно ввести любые значения в какую угодно переменную, если ей подойдёт то, что мы написали.

// запрашиваем число у пользователя print("Введите число: ") // вводим число с клавиатуры var num = readLine() // теперь в переменной num хранится то, что мы ввели

Вывод данных в терминал

Для стандартного вывода данных можно использовать команду print() или println(). Они отличаются тем, что в первой команде курсор остаётся на той же строке, а во второй курсор после вывода перейдёт на новую строчку.

// После вывода «Привет» курсор останется на этой же строке, сразу после буквы «т» print("Привет") // а после этой команды курсор перейдёт на новую строку println("Это журнал Код") // в итоге у нас получится надпись «ПриветЭто журнал Код»

Присваивание и сравнение

Присваивание обозначается одним знаком равно, а проверка на равенство — двумя:

// это присваивание var s = 2 s = 5 // а это — сравнение s == 1

Ещё есть другие, тоже привычные всем операторы сравнения:

  • равно (a == b)
  • не равно (a != b)
  • больше (a > b)
  • меньше (a < b)
  • больше или равно (a >= b)
  • меньше или равно (a

Команды сравнения чаще всего используются в циклах и условных операторах.

Условный оператор if

Этот условный оператор работает так же, как и в других языках программирования: проверяет значение выражения и если оно истинно, то выполняет что-то одно, а если нет, то может выполнить что-то другое.

// если условие выполняется — выводим сообщение if team > 50 < print("Вы превысили допустимое число команд") // в противном случае увеличиваем групповой счёт на единицу >else

Условные операторы можно вкладывать друг в друга сколько угодно раз, а внутри писать сколько угодно команд. Иногда для упрощения кода используют оператор множественного выбора.

Оператор множественного выбора case

Допустим, мы показали пользователю меню с выбором действий, и теперь ему нужно ввести номер команды из меню. В зависимости от того, что введёт пользователь, мы должны выполнить разные команды. В Swift для этого используют оператор case:

let menu = readLine() switch menu < // если введена единица case 1: visibleComment = "Пользователь добавлен в список" // если пользователь ввёл 2 или 3 case 2, 3: accessLevel = true // если ввёл 4 case 4: print("Не хватает прав доступа") // если ввёл любое другое значение default: print("Такой команды нет в меню") accessCounr += 1 >

Цикл с предусловием for-in

Чтобы работать с циклом, где точно известно число повторений, используют последовательность с нужным числом элементов. Это очень похоже на то, что есть в Python:

// переменная цикла var i = 0; // делаем цикл от 1 до 5, включая 1 и 5 for i in 1. 5 < // выводим текущее значение переменной цикла println(i) >

Ещё вариант — использовать команду where, которая определяет условия выборки из последовательности:

// берём последовательность от 0 до 10 и используем для цикла только те числа, которые делятся на 2 без остатка for i in 0. 10 where i % 2 == 0 < // получается, что на экране будут только чётные числа println(i) >

Циклы с постусловием while и repeat-while

Если мы не знаем, сколько раз будет выполняться наш цикл, но знаем, что пока условие верное, цикл должен работать, — то в этом случае используют цикл while:

// переменная цикла var i = 10 // пока переменная больше ноля — цикл выполняется while i > 0 < // выводим текущее значение переменной print(i) // уменьшаем значение переменной на единицу i -= 1 >

С этим циклом есть один нюанс: если условие сразу не выполняется, то цикл вообще не запустится и то, что написано внутри, тоже ни разу не сработает. Если же нам нужно, чтобы цикл выполнился как минимум один раз, а потом уже запускал все проверки, используют цикл repeat-while. Он как бы переворачивает цикл вверх ногами: сначала команды, а потом проверка:

// переменная цикла var i = 10 // сразу запускаем цикл, на первом шаге без проверки repeat < // выводим текущее значение переменной print(i) // уменьшаем значение переменной на единицу i -= 1 // пока переменная больше ноля — цикл продолжает выполняться >while i > 0 

Функции

Как и в большинстве языков программирования, в Swift функция может возвращать какое-то значение, а может и работать сама по себе. Самая простая функция выглядит так:

func hello() print(«Привет, это журнал Код»)
>

Эта функция ничего не возвращает, а при вызове hello() просто выводит на экран нужную фразу.

Если мы хотим передать в функцию какие-то параметры, то их нужно прописать в круглых скобках при объявлении:

func hello(name: String) < print("Привет, \(name) ; , это журнал Код") >// вызываем функцию hello(name: "Миша") // Привет, Миша, это журнал Код

Чтобы функция возвращала какое-то значение, мы должны указать тип этого значения, например, что функция вернёт строку или число:

func hello(name: String) -> String < // возвращаем новую строку с именем внутри return("Привет, \(name) ; , это журнал Код") >// вызываем функцию с помощью команды вывода на экран print(hello(name: "Миша")) // Привет, Миша, это журнал Код

Классы

Классы определяются так, как это принято в ООП — сначала идёт название класса, потом переменные (свойства класса) и функции (методы класса, если они нужны):

// объявляем новый класс class User < // определяем возраст пользователя по умолчанию var age: Int = 18 // переменная для хранения имени пользователя var name: String = "" // метод внутри класса func newUser()< print("Это новый клиент, предложите ему бонусную карту") >>

Объекты

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

// создаём объект класса User // теперь клиент mike — это наш новый объект со всеми свойствами класса var mike: User = User() // задаём возраст клиента mike.age = 22 // и его имя mike.name = "Миша" // выводим имя клиента на экран print(mike.name) // вызываем метод класса mike.new() // на экране появится надпись "Это новый клиент, предложите ему бонусную карту"

�� Если пока не знаете, зачем нужны классы и объекты, прочитайте наш цикл статей про объектно-ориентированное программирование.

Что ещё

Или оставайтесь у нас, мы будем рассказывать про технологии и программирование на русском 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *