Задание 1 CS193P 2016

229 views
Skip to first unread message

tatiana.kornilova

unread,
May 6, 2016, 3:25:52 PM5/6/16
to Swift [ru]
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

Ivan Lazarev

unread,
May 7, 2016, 3:47:09 PM5/7/16
to Swift [ru]
реализация пункта 2, обязательного задания

добавил отдельный action для кнопки разделителя:

    @IBAction func touchDecimalSeparator() {

        if userIsInTheMiddleOfTypingANumber{

            if display.text!.rangeOfString(decimalSeparator) == nil {

                display.text = display.text! + decimalSeparator

            }

        } else {

            display.text = "0" + decimalSeparator

            userIsInTheMiddleOfTypingANumber = true

        }

    }

, ранее определен символ разделителя:

    let decimalSeparator = NSNumberFormatter().decimalSeparator



пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:

Ilya Dolgopolov

unread,
May 24, 2016, 12:41:30 AM5/24/16
to Swift [ru]
Привет, всем,

А как добавить символы x в степени y  и тп?

Я поискал в Unicode  таблице, нашел "подстрочные и надстрочные символы", но там у меня часть символов пустыми квадратами и когда запускаешь приложение вместо символа знак ?

пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

tatiana.kornilova

unread,
May 24, 2016, 12:54:42 AM5/24/16
to Swift [ru]



вторник, 24 мая 2016 г., 7:41:30 UTC+3 пользователь Ilya Dolgopolov написал:

tatiana.kornilova

unread,
May 24, 2016, 12:57:17 AM5/24/16
to Swift [ru]
Мой вариант решения опубликован на Github https://github.com/BestKora/Assignment-1-2016-Calculator .


пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

Dolgopolov Ilya

unread,
May 24, 2016, 1:14:38 AM5/24/16
to tatiana.kornilova, Swift [ru]
Да! спасибо, понял, разобрался! еще раз спасибо
 
24.05.2016, 07:54, "tatiana.kornilova" <tatiana....@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/tfD60V0-mVU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/c1119742-b0c0-4935-a538-efa4f277abcc%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
 
 
-------
С уважением, Долгополов Илья,
Best Regards, Dolgopolov Ilya
 

Ilya Dolgopolov

unread,
May 24, 2016, 2:49:51 AM5/24/16
to Swift [ru]
а еще вопрос насчет адаптивности дизайна: если запускать калькулятор для 5S, то во-первых в вертикальном режиме надписи больше 3-х символов не входят вместо них ..., а при изменении ротации, шрифт дисплея обрезается.
Собственно вопрос: это лечится программным способом? или есть чудесные свойства в xcode?


пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

tatiana.kornilova

unread,
May 24, 2016, 3:37:20 AM5/24/16
to Swift [ru]
С дисплеем проще. Это метка и нее есть свойство Autoshrink (то есть автоматическое сжатие), для которого можно установить "Min Font Size" так, чтобы метка сжималась до определенного размера фонта (до 9).



 Кстати, это первое, что сделал профессор на Лекции 1. Далее в Задании 1 вам предложат использовать NSNumberFormatter  и с его помощью указать только 6 значащих цифр на дисплеи, что сделает  Autoshrink уже не нужным.
Что касается кнопок, то я уменьшила размер системного фонта до 21, так как у кнопок нет такого Autoshrink свойства в Xcode. 
Для кнопок можно программным способом адаптировать фонт:
В viewDidLoad

       rand?.titleLabel?.adjustsFontSizeToFitWidth = true



вторник, 24 мая 2016 г., 9:49:51 UTC+3 пользователь Ilya Dolgopolov написал:

Dolgopolov Ilya

unread,
May 24, 2016, 3:47:41 AM5/24/16
to tatiana.kornilova, Swift [ru]
по поводу AutoShrink я устанавливал его как было сказано в лекции но для 5s края все равно обрезались
хм нужно было уменьшить шрифт сильнее, затупил
 
 
24.05.2016, 10:37, "tatiana.kornilova" <tatiana....@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/tfD60V0-mVU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/46994fbc-bf76-440f-9691-ecec5cf54588%40googlegroups.com.

Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Ilya Dolgopolov

unread,
May 25, 2016, 12:46:49 PM5/25/16
to Swift [ru]
Моя версия https://github.com/llodi/Calculator_cs193p_Spring

еще планирую адаптивность добавить, и сделать свою версию синглтон переменной для форматирования


пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

Ilya Dolgopolov

unread,
May 25, 2016, 12:49:48 PM5/25/16
to Swift [ru]
и ксати вопрос, форматирование, 6 символов - это же контроллер, т.к. это нужно для лучше отображения, и не влияет на данные в целом
почему это вынесено даже в задании в модель?

пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

tatiana.kornilova

unread,
May 26, 2016, 4:04:51 AM5/26/16
to Swift [ru]
1. Куда вы поместили файл CalculatorBrain? Он у вас не в той группе. Он должен быть там же, где ViewController.
2. А что с этим примером? Он показывает неправильное описание. По описанию результат будет 37, а не 72

3. formatter нужен и в CalculatorBrain (для описания description нужно преобразовывать операнды из Double в String), и в ViewController. 

Поэтому создаем глобальную переменную все равно в каком файле.


let formatter:NSNumberFormatter = {

    let formatter = NSNumberFormatter()

    formatter.numberStyle = .DecimalStyle

    formatter.maximumFractionDigits = 6

    formatter.notANumberSymbol = "Error"

    formatter.groupingSeparator = " "

    formatter.locale = NSLocale.currentLocale()

    return formatter


} ()


Обратите внимание на круглые скобки в конце. Это инициализация переменной (или константы) с помощью мгновенного выполнения замыкания (в книге “The Swift Programming Language.”  нужно искать текст "Setting a Default Property Value with a Closure or Function"), это выполняется один раз.
Остальное все прекрасно. Кстати, у вас очень красивый и не агрессивный Калькулятор.
 

среда, 25 мая 2016 г., 19:46:49 UTC+3 пользователь Ilya Dolgopolov написал:
Message has been deleted

Ilya Dolgopolov

unread,
May 26, 2016, 5:05:31 AM5/26/16
to Swift [ru]


Татьяна, по п.1 он там же где и контролер.
по п. 2 да придется поправить, и наверное возьму за основу что у вас, как-то сложно мне придумывать что-то свое.

п3. сделал в виде статичной структуры.

с адаптивностью и форматером выложил https://github.com/llodi/Calculator_cs193p_Spring

приоритет операций доделаю.

четверг, 26 мая 2016 г., 11:04:51 UTC+3 пользователь tatiana.kornilova написал:

tatiana.kornilova

unread,
May 26, 2016, 5:26:27 AM5/26/16
to Swift [ru]
По пункту 1 вы показали, что CalculatorBrain "логически" там же, где и ViewController, но нужно, чтобы эти файлы физически были в  папке Calculator


 Я не вижу у Вас никакой структуры, а только класс


.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .




четверг, 26 мая 2016 г., 12:05:31 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
May 26, 2016, 12:45:53 PM5/26/16
to Swift [ru]
Татьяна, спасибо вам большое, за ваш колоссальный труд
я поправил, много напутал, в том числе в постах выше


продолжу дальше обучение

четверг, 26 мая 2016 г., 12:26:27 UTC+3 пользователь tatiana.kornilova написал:
Message has been deleted

Лётчик Космос

unread,
May 30, 2016, 7:52:29 AM5/30/16
to Swift [ru]
Добрый день!
Если выбираю подстрочный или надстроечный, то просто появляется черточка. Как поставить цифру вместо черточки?

вторник, 24 мая 2016 г., 7:54:42 UTC+3 пользователь tatiana.kornilova написал:

tatiana.kornilova

unread,
May 30, 2016, 8:06:35 AM5/30/16
to Swift [ru]



понедельник, 30 мая 2016 г., 14:52:29 UTC+3 пользователь Лётчик Космос написал:

Лётчик Космос

unread,
May 30, 2016, 8:34:27 AM5/30/16
to Swift [ru]
 Отлично, спасибо!)

Я сейчас работаю над выполнением второго задания, есть ли уже тема с обсуждением второго задания?

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


пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

tatiana.kornilova

unread,
May 30, 2016, 8:38:53 AM5/30/16
to Swift [ru]
Никаких правил. Вы можете сами открыть новую тему, например, "Задание 2 Весна 2016 Умный калькулятор" и выложить свое решение.

понедельник, 30 мая 2016 г., 15:34:27 UTC+3 пользователь Лётчик Космос написал:

Ivan Lazarev

unread,
May 30, 2016, 6:13:47 PM5/30/16
to Swift [ru]
Всем привет!
Наконец-то добрался доделать 1 задание (повторно, по рекомендации Татьяны).
Многое навеяно рекомендациями, но попробовал добавить и своего: https://github.com/ballard/calculatorMVC-V2


пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

Ivan Lazarev

unread,
Jun 11, 2016, 5:42:20 PM6/11/16
to Swift [ru]
А кто нибудь знает как реализовать стэк вью так, чтобы кнопки и display растягивались до краев экрана, так, чтобы не оставалось зазора как в примере на лекции? Что то не могу найти как это сделать...хочется сделать вид похожий на стандартный

Andrew Semjonov

unread,
Sep 13, 2016, 9:06:15 AM9/13/16
to Swift [ru]
Здравствуйте. ПытаюсЬ разобраться в Вашем решение первого задания, но пока не могу понять многие моменты...

1) В enum Operation бинарная операция имеет следующий вид:  case BinaryOperation((Double, Double) -> Double, (String, String) -> String, Int) , но уже  в словаре 
"+": Operation.BinaryOperation(+, { $0 + " + " + $1 }, 0), можете объяснить, что проишдоит в данной записи

2) так же не могу понять  Int.max это максимальное значение Int, так? То как собственно в дальнейшем currentPrecedence может быть currentPrecedence < precedence , если мы сразу задаем ей currentPrecedence = Int.max. Можно по-подрбонее о применение данной переменной currentPrecedence ?

Спасибо

пятница, 6 мая 2016 г., 22:25:52 UTC+3 пользователь tatiana.kornilova написал:
Опубликовано на русском языке Задание 1 CS193P 2016: Calculator в посте. В этом разделе вы можете обсуждать свои варианты решения.

tatiana.kornilova

unread,
Sep 13, 2016, 2:20:17 PM9/13/16
to Swift [ru]
1) В определении  BinaryOperation((Double, Double) -> Double, (String, String) -> String, Int)  первым стоит замыкание типа (Double, Double) -> Double.

Дело в том, что оператор сложения + в Swift  представляет собой функцию типа (Double ,  Double )-> Double, и мы можем оставить только этот символ. То же самое с оператором умножения * — это тоже функция типа (Double ,  Double )-> Double. Все операторы * , + , , /  в Swift определены таким образом, что они являются инфиксными правыми операторами

infix operator <*> { associativity right }

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

Мы не можем также поступить с делением / и вычитанием  из-за обратного порядка операндов.

Вторым аргументом также  стоит замыкание типа (String, String) -> String. И мы используем замыкание  { $0 + " + " + $1 } с анонимными аргументами
$0 и $1, которые являются строками.
С аргументом Int - все понятно.
2) Если вы посмотрите внимательно код, то увидите, что при первом же сравнении currentPrecedence < precedence, которое будет true, далее в коде произойдет переприсвоение currentPrecedence = precedence и мы получим реальный приоритет операции

Это специальный программистский прием - присваивается заведомо большое значение, которое заставляет работать код так, как вам нужно.
Для начала я вам не советую связаться с приоритетом операций precedence. Не используйте его, уберите из определения бинарной операции. Используйте его только тогда, когда почувствуете в этом необходимость, потому что это - уже "высший пилотаж".

вторник, 13 сентября 2016 г., 14:06:15 UTC+1 пользователь Andrew Semjonov написал:

Andrew Semjonov

unread,
Sep 14, 2016, 12:15:30 PM9/14/16
to Swift [ru]
Спасибо за Ваш пояснение!

1) То есть это грубо говоря супер short запись линейных замыканий, где уже сам Swift понимает откуда брать операнды, а нам достаточно установить только знак, но в случае с - и / возможно мы хотим делить или минусовать операнд $1 поэтому нужно быть осторожным, так?
1.1 Второй аргумент замыкания (String, String) -> Sting , то я правильно понимаю  $0 + " + " + $1 - это уже,что проходит с аргументами внутри функции поэтому  мы так смело между ними добавляем "+" ?

2) Я совсем запутался, как при первом сравнение currentPrecedence < precedence может быть true, если мы рассматриваем к примеру "+" : Operation.BinaryOperation(/, { $0 + " ÷ " + $1 }, 0) precedence = 0, а currentPrecedence  = Int.max ? 

А вообще, как Вы считаете полезно ли разбираться в чужих вариантах решения домашних задач? Просто чувствую отсутствия практики, так как задания со стэнфорда требуют мало кода, а разбор самих лекций занимает много времени, которое чаще не связано с Xcode

вторник, 13 сентября 2016 г., 21:20:17 UTC+3 пользователь tatiana.kornilova написал:

tatiana.kornilova

unread,
Sep 14, 2016, 3:35:39 PM9/14/16
to Swift [ru]
Ды, насчет currentPrecedence < precedence равно true я не права, так как действительно precedence = 0, а currentPrecedence имеет максимальное значение.

 if currentPrecedence < precedence {

        descriptionAccumulator = "(" + descriptionAccumulator + ")"

  }

   currentPrecedence = precedence

   pending = PendingBinaryOperationInfo(b... 

           

Но это не меняет дело, все равно вне зависимости от результата сравнения 
строка кода 

   currentPrecedence = precedence

выполняется, и больше мы не увидим максимальное значение.

Насчет того, как Swift понимает, откуда берутся типы операндов, лучше почитать документацию  по Swift в разделе “Type Safety and Type Inference”
(то есть вывод типа из контекста).
Сначала нужно решить Задание самому, а потом можно смотреть чужие решения. Я считаю, что очень полезно смотреть чужие решения, потому что видны другие направления мысли и другая техника программирования - можно взять лучшее.

среда, 14 сентября 2016 г., 17:15:30 UTC+1 пользователь Andrew Semjonov написал:

Andrew Semjonov

unread,
Sep 15, 2016, 3:17:24 AM9/15/16
to Swift [ru]
Спасибо за совет.

Разобрался я о том как работает currentPrecedence и precedence - очень круто, как по мне. Вот только мне кажется нет необходимости в descriptionAccumulator переопределять getter таким способом:

didSet {
            if pending == nil {
                currentPrecedence = Int.max
            }
        }

Это сделанно, чтобы не попасть в данный конструкцию 

if currentPrecedence < precedence {
                    descriptionAccumulator = "(" + descriptionAccumulator + ")"
                }

верно?

Но ведь мы и так туда не попадём, если не прибегаем к case .BinaryOperation(let function, let descriptionFunction, let precedence): а если всё-таки прибегаем то это теряет смысл? 
В чём мои заблуждения?

А так круто реализовано currentPrecedence /precedence, чтобы попасть или не попасть в зависимости от знака операции  использованной до этого.


среда, 14 сентября 2016 г., 22:35:39 UTC+3 пользователь tatiana.kornilova написал:
Reply all
Reply to author
Forward
0 new messages