Задание 2 CS193P 2016

198 views
Skip to first unread message

Ilya Dolgopolov

unread,
May 28, 2016, 9:56:33 AM5/28/16
to Swift [ru]
Всем привет


моя версия реализации задания 2, часть кнопки M и M

Ilya Dolgopolov

unread,
May 29, 2016, 1:55:35 AM5/29/16
to Swift [ru]
а еще мне совсем не понятно, что должна делать кнопка Undo в 10п. 2го задания (написано, что кнопка должна отменять установку переменной, как операнда, те действие brain.setOperand(displayValue))

те если я ввел 2 + (в истории "2 + ...")  и нажал Undo, то 
  1. он оба действия должен отменить?
  2. отменить + 
  3. либо отменить только 2, чтоб можно было ввести первый операнд, потом к примеру нажать enter ввести второй и получить результат суммы?

tatiana.kornilova

unread,
May 29, 2016, 2:47:00 PM5/29/16
to Swift [ru]
Посмотрела ваш код. По-моему у вас кнопки M и M неправильно работают. 
На стадии +14  = display показывает 18, description теперь (9+M)+14 
у Вас показывает (9+7)+14 ; M - вообще пропала.
Функции у кнопок очень простые.
Кнопка M должна писать в словарь  var variableValues = [String:Double]()значение с экрана.
Можно напрямую, если у вас variableValues - public
ViewController

    @IBAction func setM(sender: UIButton) {

        userIsInTheMiddleOfTyping = false

        let symbol = String((sender.currentTitle!).characters.dropFirst())

        if let value = displayValue {

           

            brain.variableValues[symbol] = value

            displayValue = brain.result

        }

    }


Кнопка M должна разместить себя как переменную в program и рассчитать результат, 

взяв в качестве M значение из словаря или,если не найдет там значения,то 0.

ViewController

    @IBAction func pushM(sender: UIButton) {

        brain.setOperand(sender.currentTitle!)

        displayValue = brain.result

         }

Взгляните на два варианта  setOperand - для Double и для String - они практически одинаковые:


CalculatorBrain  

    func setOperand(operand: Double) {

        accumulator = operand

        descriptionAccumulator = formatter.stringFromNumber(accumulator) ?? ""

        internalProgram.append(operand)

    }

    

    func setOperand(variable: String) {

        accumulator = variableValues[variable] ?? 0

        descriptionAccumulator = variable

        internalProgram.append(variable)

    }

Часть, связанная с program у вас сделана правильно.


Вы должны добиться  (9+M)+14 
Нам нужно, чтобы M оставалось, так как в Задании 3 мы будем строить графики.
Я не до конца сделала задание 2, но в ближайшее время постараюсь прислать код.
суббота, 28 мая 2016 г., 16:56:33 UTC+3 пользователь Ilya Dolgopolov написал:

tatiana.kornilova

unread,
May 30, 2016, 12:57:03 AM5/30/16
to Swift [ru]
Мой код можно посмотреть здесь 
Но вам еще надо разобраться с вашей storyboard - там "красный кружочек", который говорит, что у вас есть проблемы с Autolayout

Нужно использовать Compression Resistance Priority как говорится в подсказке №7 Задания 1

Кроме того, профессор не любит "магических" чисел, так что установите либо в Standard, либо в 0





суббота, 28 мая 2016 г., 16:56:33 UTC+3 пользователь Ilya Dolgopolov написал:
Всем привет

tatiana.kornilova

unread,
May 30, 2016, 1:00:22 AM5/30/16
to Swift [ru]
Undo - имеется ввиду убрать элемент из internalProgram

    func undoLast() {

        guard !internalProgram.isEmpty  else { return }

        internalProgram.removeLast()

        program = internalProgram

    }


так что в вашем случае сначала уберется "+", а в следующий раз 2.
воскресенье, 29 мая 2016 г., 8:55:35 UTC+3 пользователь Ilya Dolgopolov написал:
Message has been deleted

Ilya Dolgopolov

unread,
May 30, 2016, 2:27:07 AM5/30/16
to Swift [ru]

Татьяна, спасибо,

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

1. Странно, но у меня xcode не показывал никаких проблем с autolayout. Я правильно понимаю, что у меня в Compression Resistance Priority были значения 13 и 14, а это не очень хороший стиль?
исправил на Standart
2. по поводу Memories button:
2.1 для M - добавил условие: "and then show the brain’s result in the display" - не внимательно прочитал ТЗ (((
2.2. ошибка у меня была как раз в реализации program в brain:  при извлечении из массива, я передавал в setOperand, значение из словаря, а не имя самой переменной, в итоге на дисплее у меня отображалось не M, а 7

undo реализую, наверное как у вас :) т.к. че ж тут еще более гениальное то придумаешь :) ;)

мой код: https://github.com/llodi/Calculator_cs193p_Spring

tatiana.kornilova

unread,
May 30, 2016, 2:45:12 AM5/30/16
to Swift [ru]
Какая у вас версия Xcode? У меня Version 7.3.1 (7D1014).

понедельник, 30 мая 2016 г., 9:27:07 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
May 30, 2016, 3:12:37 AM5/30/16
to Swift [ru]
Да такая же, просто я с 2-х мест выполняю задания с мака и виртуалки, на обоих Version 7.3.1 (7D1014)

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

unread,
May 30, 2016, 10:09:54 AM5/30/16
to Swift [ru]
Мое решение

Покритикуйте, пожалуйста)

 Undo до ума так и не довел..


суббота, 28 мая 2016 г., 16:56:33 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
May 30, 2016, 1:15:47 PM5/30/16
to Swift [ru]
Ура! Я вроде разобрался, и реализовал Undo часть для кнопки backspace, вроде даже как работает
https://github.com/llodi/Calculator_cs193p_Spring/tree/master/Calculator  

tatiana.kornilova

unread,
May 30, 2016, 10:38:58 PM5/30/16
to Swift [ru]
Хорошо, что вы сделали "переменные" через performOperation и довели все до конца - для "М" все работает,
 но, к сожалению, только для "М".

1. В обязательном пункте 4 сказано, что "ваш Калькулятор должен поддерживать любое число переменных".
 Следовательно, Модель вообще не должна знать, что существует "М". 
Поэтому скорее всего .Variable (String) должна иметь ассоциированное значение String для символа переменной.

   private enum Operation {

        case Variable (String)

        case Constant(Double)

        case UnaryOperation((Double) -> Double, (String) -> String)

        case BinaryOperation((Double, Double) -> Double, (String, String) -> String, Int)

        case Equals

    }


И вам придется  записывать символ переменной в  словарь операций

operations[symbol] = .... 

и т.д.

Кстати, во ViewController тоже не должно быть в явном виде "М"
Так что нужно писать код на общий случай, когда кто-нибудь может "привинтить" кнопку Y

2. Для "backspace" и Undo должны быть в одной кнопке в зависимости от того, в каком режиме пользователь.
Обязательный пункт 11 прочтите внимательно

3. Этот код

  if variableValues[variableName] == nil {

            variableValues[variableName] = 0.0

        }

можно не писать, а доставать значение из словаря более Swifty кодом

       accumulator = variableValues[variable] ?? 0


4. Для Undo нужно проверять, что internalоrogram  не пустой, а иначе ваше приложение "крашит" (аварийно заканчивается)


  guard !internalProgram.isEmpty  else { return }

        internalProgram.removeLast()


То же самое 

    if let value = displayValue { // это нужно, если на дисплее текст 

         brain.variableValues["M"] = displayValue

    }

5. Нужно убрать в ViewController весь код, связанный с savedProgram , ведь профессор просил сделать это на лекции.

6. Где сообщение об ошибках в дополнительном пункте? 

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

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

unread,
May 31, 2016, 2:22:08 AM5/31/16
to Swift [ru]
Спасибо, Татьяна!

Как же приятно всё-таки получить обратную связь, а то я думал, что я с ума сойду один на один с этим калькулятором)

Постараюсь всё поправить.


суббота, 28 мая 2016 г., 16:56:33 UTC+3 пользователь Ilya Dolgopolov написал:
Всем привет

tatiana.kornilova

unread,
May 31, 2016, 2:32:58 AM5/31/16
to Swift [ru]
Да, я вас понимаю. Три года назад был стэнфордский курс Coding Together (Кодируем вместе)  и все посылали свой код на площадку Pizza. Мы делились на группы по 5-7 человек и должны были давать callback друг другу, но можно было задать вопрос и на общем форуме.  Обсуждения, которые велись там, дали мне гораздо больше, чем что-либо еще.  Я хотела организовать что-то подобное и здесь. Но пока не получается. Так что, если хотите помочь, то можете давать callback тем, кто посылает код на этот форум, тем более чувствуется, что вас есть хороший background.

вторник, 31 мая 2016 г., 9:22:08 UTC+3 пользователь Лётчик Космос написал:

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

unread,
May 31, 2016, 3:00:17 AM5/31/16
to Swift [ru]
Да, слышал про Piazza и пытался найти какое-нибудь подобное сообщество в интернете. Данная группа и ваш блог это единственное, что удалось найти. Так что спасибо вам еще раз за ваш труд.
Такое сообщество просто необходимо для тех, кто проходит этот курс. Я программист .NET, решил попробовать программирование под IOS и начал с этого курса. Уровень английского, насколько я могу о себе судить, позволяет смотреть лекции и читать задания на английском. Лектор по-настоящему крут!)

Несмотря на то, что у меня есть опыт программирования .NET, в IOS, Swift и XCode я всё-таки новичок и чувствую себя как ученик в первом классе, но который пришел из хорошей подготовительной группы:) Я постараюсь также давать callback другим участникам, как только я сам как следует разберусь в задании. Я так понимаю на данные момент Вы среди нас самый опытный участник, поэтому на Вас вся надежда. 
Если получится дойти этот курс до конца, это будет чудо, лично для меня:)

Еще раз повторюсь, со своей стороны также  постараюсь проявить самое активное участие в общении.

Спасибо.

вторник, 31 мая 2016 г., 9:32:58 UTC+3 пользователь tatiana.kornilova написал:

tatiana.kornilova

unread,
May 31, 2016, 3:09:37 AM5/31/16
to Swift [ru]
Если хотите зайти на Piazza, то это можно сделать для курса CodingTogether iOS 6 по ссылке. После регистрации вы попадаете на форум, где можно все посмотреть, но там Objective-C и iOS 6.

вторник, 31 мая 2016 г., 10:00:17 UTC+3 пользователь Лётчик Космос написал:

Ilya Dolgopolov

unread,
May 31, 2016, 3:48:18 AM5/31/16
to Swift [ru]
Я реализовал обязательные задания 2го Assignment, наверное пойду дальше по урокам
https://github.com/llodi/Calculator_cs193p_Spring/tree/master/Calculator 
наверное пойду дальше по урокам, смотрел 4-й, придется пересмотреть, больно сложный для восприятия и как-то упорядочивания информации
а может просто нужно руку набивать на практических примерах.

понедельник, 30 мая 2016 г., 20:15:47 UTC+3 пользователь Ilya Dolgopolov написал:

tatiana.kornilova

unread,
May 31, 2016, 4:03:05 AM5/31/16
to Swift [ru]
Смысл Undo в следующем: я набираю M, cos, +, M, = -> на description  cos (M) +M=   на дисплее - 1
Дальше я хочу присвоить M не 0, а 𝛑 - я набираю  𝛑  и →M, так как  𝛑 - операция, она мне не нужна, я делаю Undo.
получаю   на description  cos (M) +M=   на дисплее - 2,141593
В вашем приложении мне это сделать не удалось -  𝛑  не уходит.

вторник, 31 мая 2016 г., 10:48:18 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
May 31, 2016, 6:14:06 AM5/31/16
to Swift [ru]
Проблема тут в логике опять же М, т.к. задача была писать в переменную числовое значение, а 𝛑
а сейчас у меня реализовано, что в internalProgramm пишется и M  и 𝛑 следом и М  →M не работают как надо.

вторник, 31 мая 2016 г., 11:03:05 UTC+3 пользователь tatiana.kornilova написал:

Ilya Dolgopolov

unread,
May 31, 2016, 12:57:27 PM5/31/16
to Swift [ru]
И судя по описанию задания 2 не подразумевалось, что значение 𝛑 в М
Для того, чтобы это работало, нужно как было предложено выше делать через performOperand и записывать словарь operations
Проблема в том, что с начала в M пишется значение 𝛑
и в internalProgram пишется М, а потом и 𝛑 , как операция перезаписывает, то что было до

вторник, 31 мая 2016 г., 13:14:06 UTC+3 пользователь Ilya Dolgopolov написал:

tatiana.kornilova

unread,
May 31, 2016, 1:28:23 PM5/31/16
to Swift [ru]
Вы неправы. У меня (код можно посмотреть здесь ) не используется performOperand , но работает правильно.
Задание 2. Подсказка 3:
"

3.  Некоторые вещи (подобные π или результат другого выражения) несколько хитроумно запоминать в M после того, как вы ввели выражение, которое вы хотите оценить (например, ввели cos(M), а затем пытаетесь установить  M в π). Как только вы реализуете Undo, вы сможете это сделать (путем  “undoing” whatever expression, including just hitting π, that you used to calculate the value you wanted to store in M).

"

вторник, 31 мая 2016 г., 19:57:27 UTC+3 пользователь Ilya Dolgopolov написал:

Dolgopolov Ilya

unread,
May 31, 2016, 2:11:28 PM5/31/16
to tatiana.kornilova, Swift [ru]
подправил, в одном месте, подсказки не читал (((

https://github.com/llodi/Calculator_cs193p_Spring
 
31.05.2016, 20:28, "tatiana.kornilova" <tatiana....@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/dbavaUYhriE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/b6c4cf89-9f5b-44ab-b0ca-6bd5c13b9ab3%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
 
 
-------
С уважением, Долгополов Илья,
Best Regards, Dolgopolov Ilya
 

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

unread,
Jun 1, 2016, 8:22:04 AM6/1/16
to Swift [ru]
Татьяна, по поводу пункта 1 из списка ваших замечаний. Я понял, что недостаток моего решения в том, что моя модель умеет работать только с переменной М. Непонятно, как сделать мое решение универсальным, то есть для любого числа переменных. Единственный выход я вижу - это добавить в switch operation ветку  default, то есть если это не операнд и не операция, значит переменная и выполнять соответствующий код:

   accumulator = variableValues[symbol]!

   descriptionAccumulator  = symbol 


Но по-моему это не очень хороший способ. 

Ознакомился с вашим решением,  наверное надо сделать как у Вас, оно понятное и универсальное.


вторник, 31 мая 2016 г., 5:38:58 UTC+3 пользователь tatiana.kornilova написал:

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

unread,
Jun 1, 2016, 8:44:50 AM6/1/16
to Swift [ru]
5. Нужно убрать в ViewController весь код, связанный с savedProgram , ведь профессор просил сделать это на лекции.

Что-то я упустил этот момент, никак не могу найти, подскажите, в какой лекции профессор говорит об этом?
То есть вообще убираем кнопки  Save  и Restore?

Еще вопрос: можно ли как-то в Xcode подключиться к github к определенному репозиторию, ссылку на который получил, и посмотреть проект в Xcode?

суббота, 28 мая 2016 г., 16:56:33 UTC+3 пользователь Ilya Dolgopolov написал:
Всем привет

Ilya Dolgopolov

unread,
Jun 2, 2016, 9:42:16 AM6/2/16
to Swift [ru]

да, кнопки Save  и Restore были показаны как пример использования переменной program и массива anyobject


среда, 1 июня 2016 г., 15:44:50 UTC+3 пользователь Лётчик Космос написал:

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

unread,
Jun 2, 2016, 9:54:53 AM6/2/16
to Swift [ru]
Илья, спасибо!

Теперь понятно.

четверг, 2 июня 2016 г., 16:42:16 UTC+3 пользователь Ilya Dolgopolov написал:

tatiana.kornilova

unread,
Jun 2, 2016, 12:06:56 PM6/2/16
to Swift [ru]
Не надо повторять мое решение - это один из вариантов. Мы разовьем ваш вариант и сделаем его универсальным - это другой вариант, более интересный.
Универсальное решение состоит в следующем:

1. добавляем в enum Operation вариант переменной, которая характеризуется только своим символом

   private enum Operation{

        

        case Variable(String)

        

        case NullaryOperation(() -> Double,String)

        case Constant(Double)

        case UnaryOperation((Double) -> Double,(String) -> String)

        case BinaryOperation((Double, Double) -> Double, (String, String) -> String, Int)

        case Equals

    }


2. для переменных пишем func setOperand(variable: String),
 в которой мы запишем переменную variable в словарь operation


 func setOperand(variable: String) {

        internalProgram.append(variable)

        if operations[variable] == nil {

            operations[variable] = Operation.Variable(variable)

        }

        performOperation(variable)

    }


Кстати, вы сделали этот пункт вручную и только для "М".

3. В функции  func performOperation(symbol: String)обрабатываем вариат .Variable

 

 func performOperation(symbol: String){

        internalProgram.append(symbol)

        if let operation = operations[symbol]{

            switch operation {


            case .Variable(let variable):

                accumulator = variableValues[variable] ?? 0

                descriptionAccumulator = variable


            case .NullaryOperation(let function, let descriptionValue):

                accumulator = function()

                descriptionAccumulator = descriptionValue


            case .Constant(let value):

                accumulator = value

                descriptionAccumulator = symbol


.  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Этот пункт у вас есть, но опять "М"

4. В program все как было у профессора на лекции ( или как у вас)

   var program: PropertyList {

        get {

            return internalProgram

        }

        set {

            clear()

            if let arrayOfOps = newValue as? [AnyObject] {

                for op in arrayOfOps {

                    if let operand = op as? Double {

                        setOperand(operand)

                    } else if let symbol = op as? String {

                        // symbol is an operation

                            performOperation(symbol)

                        

                    }

                }

            }

        }

    }


5. В ViewController считаем заголовки с кнопок →М и М так, чтобы это не зависело от М

  @IBAction func setM(sender: UIButton) {

        userIsInTheMiddleOfTyping = false

        let symbol = String((sender.currentTitle!).characters.dropFirst())

        if let value = displayValue {

            brain.setVariable(symbol, value: value)

            displayValue = brain.result

        }

    }


   @IBAction func pushM(sender: UIButton) {

        brain.setOperand(sender.currentTitle!)

        displayValue = brain.result

         }


По-моему у вас этот пункт выполнен правильно.
Так что логика полностью ваша, только небольшие штрихи в коде.

Кстати можно скачать это решение с себе в  папку Downloads 

А затем два раза кликнуть на Calculator.xcodeproj

Посмотрите, может быть у вас будут какие-то предложения.


среда, 1 июня 2016 г., 15:22:04 UTC+3 пользователь Лётчик Космос написал:

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

unread,
Jun 6, 2016, 10:37:27 AM6/6/16
to Swift [ru]
К сожалению, самому в голову не пришло, что можно динамически программно наполнять справочник   operations.
Действительно решение получилось универсальным.

1. На мой взгляд ассоциированное значение String для значения перечисления Variable лишнее. Тогда получается так:

 func setOperand(variableName: String) {

        if variableValues[variableName] == nil {

            operations[variableName] = Operation.Variable

        }

        

        performOperation(variableName)

    }


и

 

 func performOperation(symbol: String) {

        internalProgram.append(symbol)

        if let operation = operations[symbol] {

            switch operation {

            case .Variable:

                accumulator = variableValues[symbol] ?? 0.0

                descriptionAccumulator = symbol

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


2. Из функции setOperand я исключил строчку internalProgram.append(operand)

так как такая же строка есть в начале функции performOperation.

3. Вопрос: что должно происходить, если не установив переменную, попробовать записать в неё значение?


четверг, 2 июня 2016 г., 19:06:56 UTC+3 пользователь tatiana.kornilova написал:

       accumulator = variableValues<span style="c

tatiana.kornilova

unread,
Jun 6, 2016, 12:01:12 PM6/6/16
to Swift [ru]
Прекрасное решение, действительно ассоциированное значение для .Variable похоже не нужно.
Но с setOperand ((variableName: String) у нас с вами разный код. 
Зачем вы проверяете на присутствие переменной в словаре  variableValues[variableName] ?
Если его там нет, то калькулятор возьмет 0 (по умолчанию), так что вам незачем об этом заботиться.
Вообще я предлагаю очень простой код

    func setOperand(variable: String) {

        operations[variable] = Operation.Variable

        performOperation(variable)

    }

 На вопрос 3:
Процесс записи значения переменной в словарь вообще никак не связан с размещением переменной в Калькуляторе и в словаре операций как операции

  func setVariable(symbol: String, value: Double) {

        variableValues[symbol] = value

    }

Пусть "сидит" в словаре значений до поры, до времени.

Точно также, как и размещение переменной в Калькулятор для расчета не требует предварительной установки значения этой переменной.
В этом то вся прелесть.
За пункт 2 спасибо - торопилась показать вам возможность записи операции в словарь.
Как насчет Undo? Хотелось бы посмотреть ваше решение. Напомните мне ваш Github.

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

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

unread,
Jun 7, 2016, 5:04:21 AM6/7/16
to Swift [ru]
   Да, можно убрать условие 

if variableValues[variableName] == nil
И оставить просто строку operations[variableName] = Operation.Variable Этим условием я хотел сказать, что значение в словарь operations будет добавляться только один раз в момент добавления новой переменной.
Думаю, это некритично, можно убрать, а можно и оставить, в обоих случаях работает.
На вопрос 3: ясно, спасибо, похоже сейчас у меня именно так и работает. В Undo ничего особенного не сделал, выглядит сейчас, также как у вас. Просто удаляю последнюю команду из списка команд. Но при тестировании этой команды иногда получаю непредсказуемые результаты. Планирую завтра над этим поработать, плюс попробую реализовать extra задание с обработчиком ошибок. Честно говоря, уже хочется идти дальше, но наверное нужно закрыть все вопросы по этому заданию... Мой гитхаб https://github.com/pposad/assignment2-2016-calculator.git

понедельник, 6 июня 2016 г., 19:01:12 UTC+3 пользователь tatiana.kornilova написал:

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

unread,
Jun 8, 2016, 5:21:13 AM6/8/16
to Swift [ru]
Доделал Undo.  Понял, почему получал странные результаты, если несколько раз нажать кнопку Undo. Дело в том, что при пересчитывании internalоrogram у меня не удалялась предыдущая программа, таким образом internaProgram разбухал. Нужно было добавить метод clear() в самое начало установки свойства program.

 var program: PropertyList

    {

        get {

            return internalProgram

        }

        set {

            clear()

            if let arrayOfOps = newValue as?[AnyObject] {


После этого удалось протестить работу команды cos(M) с помощью кнопки Undo, тоже всё работает:)


Есть несколько вопросов:

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

 Нужно ли в этом разбираться сейчас или это будет далее в курсе? Как вы пришли к такому решению, это best practice для работы с интерфейсом?


2. Во время отладки в Xcode использую Step Over и в определенный момент меня перебрасывает на assembler. Как этого избежать? я хочу отлаживать только swift код)


3. Интерфейс групп Google не очень дружелюбный на мой взгляд:) А мы не можем зарегистрироваться на Piazza и вести общение между собой там? Может быть есть еще какие-нибудь аналогичные площадки, где уже сидят люди, которые выполняют задания и обсуждают курс? Странно, что лично мне не удалось найти ничего подобного... Такое ощущения, что во всем рунете этот курс делают только трое:)) Я, Вы и Илья


вторник, 7 июня 2016 г., 12:04:21 UTC+3 пользователь Лётчик Космос написал:

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

unread,
Jun 8, 2016, 7:46:07 AM6/8/16
to Swift [ru]
Сделал Extra задание. Сначала хотел сделать через ассоциированную функцию, как советует профессор, но, к сожалению, не догадался, что указывать в справочнике operations, если проверка для данной операции не требуется. Сейчас я понимаю, что можно просто указать nil.

В итоге я вынес всю проверку в одну функцию checkErrors, в которой проверяю, какая именно операция в данный момент выполняется. На мой взгляд это удобно тем, что логика проверки ошибок вынесена в отдельное место и не перегружает для восприятия справочник operations. Недостаток наверное в том, что в данной функции нужно определять, какая из операция в данный момент выполняется. Если ошибка есть, то пишу текст в публичное поле errorDetails.

Вопрос: как в итоге контроллер должен работать с моим отчетом ошибок? просто дать ему открытое поле с текстом ошибки и всё?

tatiana.kornilova

unread,
Jun 8, 2016, 10:08:42 AM6/8/16
to Swift [ru]

Отвечаю по порядку.
1. Адаптивный интерфейс я сделала напрасно. Просто в Задании 1 или 2 Калькулятор по iOS 8 было это задание, вот я и увлеклась. Но если оно есть, стоит его посмотреть.
Мое решение для адаптивного интерфейса связано вовсе не с тем, что у меня что-то не уместилось. Просто форма кнопок в ландшафтном режиме получается (и у вас тоже) некрасивой: длинной по ширине и очень маленькой по высоте. Это если кнопки располагать точно также, как и в портретном режиме, то есть 5 кнопок по ширине и 7 рядов. В ландшафтном режиме хочется сделать кнопки поменьше по ширине и побольше по высоте, то есть расположить их по-другому 6 кнопок по ширине и 6 рядов. Останется одна лишняя. Профессор будет делать то же самое в Лекции 12. Autolayout, но не в коде, как я, а на storyboard с использованием Size Classes и значительно сложнее. Будете слушать его Лекцию 12 - вспомните мое решение.

2. Иногда помогает прием, описанный в статье Xcode Debugging Tip: User Breakpoints . 

3. Насчет  групп Google согласна, но я не специалист. Если что-то посоветуете, можно перейти туда. В интернете есть обсуждение курса cs193P на английском и немецком языках. Например, у моего напарника по Piazza http://cs193p.m2m.at/cs193p-iphone-application-developement/ , есть и другие.
Но на русском языке я ничего не вижу, хотя море каких-то отрывочных курсов. 
Дальше чувство, что вы один занимаетесь обсуждением Заданий, будет нарастать. Я не понимаю, в чем причина, ведь на сайт заходят очень многие и многие вступают в Google группу, но в основном на просмотр, а не на обсуждение.
  
среда, 8 июня 2016 г., 12:21:13 UTC+3 пользователь Лётчик Космос написал:
   Да, можно убрать условие 
Хорошо, что вы сделали &q

Dolgopolov Ilya

unread,
Jun 8, 2016, 12:37:13 PM6/8/16
to tatiana.kornilova, Swift [ru]
Я :) я еще готов обсуждать :) 

но последний раз выкладывал мое исправленное решение, никто не прокомментил ((
я сейчас на 5 уроке, там пока заданий нет. 
 
08.06.2016, 17:08, "tatiana.kornilova" <tatiana....@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/dbavaUYhriE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/c30a6bed-9439-4394-91b9-72ed5f599c78%40googlegroups.com.

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

tatiana.kornilova

unread,
Jun 8, 2016, 1:52:09 PM6/8/16
to Swift [ru], tatiana....@gmail.com
Конечно, мы принимаем вас в нашу команду - это шутка.
Под 5 уроком вы имеете ввиду Лекцию 5?
Задание 3 Графический калькулятор ровно на эту тему.
Заводите отдельную тему и выкладывайте свое решение.
 Я посмотрю ваше Задание 2 в ближайшее время и напишу feedback, но сейчас уже и Летчик может комментировать его. 

среда, 8 июня 2016 г., 19:37:13 UTC+3 пользователь Ilya Dolgopolov написал:

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

unread,
Jun 8, 2016, 3:05:07 PM6/8/16
to Swift [ru], tatiana....@gmail.com
 Илья, потестировал немного ваше решение. Вот, что заметил:

1. Нажимаю 2 + 3, в строке истории действия вижу 2+.. 
Хотя в истории должна быть строка 2+3..

Заполнение поля sequenceОfОperandsОndОperations.text должно заполняться синхронно с полем  display
В вашем случае строка истории будет обновляться только при выполнении какой-либо операции

2. При нажатии кнопки Undo также не меняется поле истории действий

3. Если несколько раз нажать Undo появляются непредсказуемые результаты. У меня была такая же проблема. Причина в том, что нужно очищать internalоrogram перед загрузкой новой программы. Для этого нужно вызвать метод clear(). У вас он закомментирован, я раскомментировал, Undo заработало, как надо.


    var program: PropertyList {

        get {

            return internalProgram

        }

        set{

            clear()

...........


среда, 8 июня 2016 г., 20:52:09 UTC+3 пользователь tatiana.kornilova написал:
   Да, можно убрать условие 

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

unread,
Jun 8, 2016, 3:14:50 PM6/8/16
to Swift [ru], tatiana....@gmail.com
Илья, еще одно замечание:

4. Не работает последовательность действий: M, Cos, π, ->M, <=
Данная последовательность действий должна привести к  Cos(M), где М = π

У вас этого не происходит. Дело в том, что во время Undo будет вызван пересчет программ и при этом должен быть вызван метод clear(), в котором в данный момент у вас очищается справочник variableValues, справочник не должен очищаться в этом случае.

Очистку справочника variableValues лучше вынести в отдельную функцию, которая будет вызваться при нажатии кнопки С в контроллере наряду с методом clear()

среда, 8 июня 2016 г., 20:52:09 UTC+3 пользователь tatiana.kornilova написал:
Конечно, мы принимаем вас в нашу команду - это шутка.
   Да, можно убрать условие 

Ilya Dolgopolov

unread,
Jun 9, 2016, 12:38:31 AM6/9/16
to Swift [ru], tatiana....@gmail.com
Привет, всем,

Спасибо за ответы!

1. я выполнял задания с историей, проверяя результат на основании примеров, что были даны, и вроде как это соответствовало ожидаемому результату. Даже не помню, чтобы в середине ввода цифр, они должны отображаться в sequenceОfОperandsОndОperations
но я попробую что-нибудь сделать
2. Помниться clean я комментировал, т.к. этот метод, не давал должного результата, правда уже точно не помню почему, но я сделаю, как вы рекомендующее и проверю.
3. Давно хотел спросить, в своей первоначальное реализации кнопки C (clean) я выполнял создание нового объекта CalculatorBrain, и в самом  CalculatorBrain я запускал деинициализатор, чтобы убедиться, что каждый раз когда я нажимаю С, объект пересоздается. в Swift отсутствует сборщик мусора, swift подсчитывает количество ссылок, и если они отсутствуют память высвобождается. А для CalculatorBrainкак раз нет strong reference, поэтому я подумал это более аккуратный способ реализации который занимает одну строку кода.
Хотелось бы услышать ваши комментарии на этот счет?

Ilya Dolgopolov

unread,
Jun 9, 2016, 12:47:20 AM6/9/16
to Swift [ru], tatiana....@gmail.com

Не работает последовательность действий: M, Cos, π, ->M, <=

работает же? Просто после "M, Cos, π, ->M, <=" нужно нажать =.
Или как-то по другому должно работать?



среда, 8 июня 2016 г., 22:14:50 UTC+3 пользователь Лётчик Космос написал:
   Да, можно убрать условие 

         }</spa

Auto Generated Inline Image 1

Ilya Dolgopolov

unread,
Jun 9, 2016, 1:09:42 AM6/9/16
to Swift [ru], tatiana....@gmail.com

но раскоментировал clean и сделал как вы рекомендовали, действительно работает более ожидаемо.

и соответственно реализацию кнопки Clean вернул как у меня было изначально через пересоздание объекта.

https://github.com/llodi/Calculator_cs193p_Spring

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

unread,
Jun 9, 2016, 2:27:20 AM6/9/16
to Swift [ru], tatiana....@gmail.com
К сожалению, смогу посмотреть ваше решение только завтра.
По пункту 1. Да, похоже я не прав, еще раз посмотрел задание, там было такое условие: b. 7 + 9 будет показано “7 + ...” (9 на display)

Но мне всё равно больше нравится, когда сразу всё в историю пишется, оставлю так у себя)

четверг, 9 июня 2016 г., 8:09:42 UTC+3 пользователь Ilya Dolgopolov написал: 

tatiana.kornilova

unread,
Jun 9, 2016, 5:10:22 AM6/9/16
to Swift [ru]
  Вы, конечно, "выкрутились" с  checkErrors, но это не по-Swifty. Вызовы функции checkErrors стоят на правильных местах, но сама функция 
checkErrors некрасивая с бесконечными if else - лучше switch использовать

  func checkErrors(operationName: String, firstOperand: Double, secondOperand: Double?) {

        switch operationName  {

            case "√": if firstOperand<0 { errorDetails = "√ отриц. числа." }

            case "": if firstOperand<0 { errorDetails = "ln отриц. числа" }

            case "÷"if secondOperand! == 0 { errorDetails = "деление на ноль" }

             default: break

        }

    }

Следующее замечание самое важное. Дело в том, что профессор учит программировать без "магических" цифр и констант. То есть имеется ввиду недопустимость разброса по всему коду конкретных чисел и констант типа   "√", "", если только они не находятся в какой-то структуре данных (структуре struct или в словаре Dictionary) в одном месте, где их можно изменить. В нашем CalculatoBrain это словарь с операциями и все-таки именно там лучше размесить все сведения об операциях. В конце концов его можно сделать public и заполнять откуда хочешь. Помимо этого это обучающий пример и он хочет видеть, что владеете техникой работы с функциями как параметрами или ассоциированными значениями.
Поэтому лучше все-таки увеличить количество ассоциированных значений для UnaryOperation и Operation:

 private enum Operation{

        case Variable

        case NullaryOperation(() -> Double,String)

        case Constant(Double)

        case UnaryOperation((Double) -> Double,(String) -> String, (Double -> String?)?)

        case BinaryOperation((Double, Double) -> Double, (String, String) -> String, Int,((Double, Double) -> String?)?)

        case Equals

    }

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

  private var operations : [String: Operation] = [

        "rand": Operation.NullaryOperation(drand48, "rand()"),

        "π": Operation.Constant(M_PI),

        "e": Operation.Constant(M_E),

        "±": Operation.UnaryOperation({ -$0 }, { "±(" + $0 + ")"}, nil),

        "√": Operation.UnaryOperation(sqrt, { "√(" + $0 + ")"}, { $0 < 0 ? "√ отриц. числа" : nil }),

        "cos": Operation.UnaryOperation(cos,{ "cos(" + $0 + ")"}, nil),

        "sin": Operation.UnaryOperation(sin,{ "sin(" + $0 + ")"}, nil),

        "tan": Operation.UnaryOperation(tan,{ "tan(" + $0 + ")"}, nil ),

        "sin⁻¹" : Operation.UnaryOperation(asin, { "sin⁻¹(" + $0 + ")"}, { $0 < -1.0 || $0 > 1.0 ? "не в диапазоне [-1,1]" : nil }),

        "cos⁻¹" : Operation.UnaryOperation(acos, { "cos⁻¹(" + $0 + ")"}, { $0 < -1.0 || $0 > 1.0 ? "не в диапазоне [-1,1]" : nil }),

        "tan⁻¹" : Operation.UnaryOperation(atan, { "tan⁻¹(" + $0 + ")"}, nil),

        "ln" : Operation.UnaryOperation(log, { "ln(" + $0 + ")"},{ $0 < 0 ? "ln отриц. числа" : nil }),

        "x⁻¹" : Operation.UnaryOperation({1.0/$0}, {"(" + $0 + ")⁻¹"},{ $0 == 0.0 ? "Деление на ноль" : nil }),

        "х²" : Operation.UnaryOperation({$0 * $0}, { "(" + $0 + ")²"}, nil),

        "×": Operation.BinaryOperation(*, { $0 + " × " + $1 }, 1, nil),

        "÷": Operation.BinaryOperation(/, { $0 + " ÷ " + $1 }, 1,{ $1 == 0.0 ? "Деление на ноль" : nil }),

        "+": Operation.BinaryOperation(+, { $0 + " + " + $1 }, 0, nil),

        "−": Operation.BinaryOperation(-, { $0 + " - " + $1 }, 0, nil),

        "xʸ" : Operation.BinaryOperation(pow, { $0 + " ^ " + $1 }, 2, nil),

        "=": Operation.Equals

    ]

В остальном все, как у вас там, где вы вызываете checkErrors, у меня validator
.  .  .  .  .  .  .  .  .

  case .UnaryOperation(let function, let descriptionFunction, let validator):

                if let validatorUnary = validator {

                    error = validatorUnary(accumulator)

                }

                accumulator = function(accumulator)

                descriptionAccumulator = descriptionFunction(descriptionAccumulator)

.  .  .  .  .  .  .

 private func executeBinaryOperation(){

        

        if pending != nil{

            if let validatorBinary = pending!.validator {

                error = validatorBinary(pending!.firstOperand, accumulator)

            }

            accumulator = pending!.binaryOperation(pending!.firstOperand, accumulator)

                      descriptionAccumulator = pending!.descriptionFunction(pending!.descriptionOperand, descriptionAccumulator)

            pending = nil

        }

    }


  С точки зрения возвращения ошибки errorDetails логика, как всегда, безупречна. Но опять попробуйте вернуть не просто result, а кортеж (result, errorDetal) и обрабатывать его с помощью оператора switch с паттернами:

   private var resultValue: (Double, String?) {

        get {

         .  .  .  .  .  .  .

        }

        set {

            let (result, error) = newValue

            switch (result, error) {

            case (_, nil) : displayValue = result

            case (_, let error):

                display.text = error

                history.text = brain.description + (brain.isPartialResult ? " …" : " =")

                userIsInTheMiddleOfTyping = false

            }

         }

    }

Вообще первые 2 Задания, как бы они не были назойливы - на освоение синтаксических конструкций Swift. Дальше это все пригодится, но будет не до того.

среда, 8 июня 2016 г., 14:46:07 UTC+3 пользователь Лётчик Космос написал:

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

unread,
Jun 9, 2016, 6:19:02 AM6/9/16
to Swift [ru]
Абсолютно с Вами согласен.

Спасибо за столь ценные замечания!



четверг, 9 июня 2016 г., 12:10:22 UTC+3 пользователь tatiana.kornilova написал:

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

unread,
Jun 10, 2016, 3:15:14 AM6/10/16
to Swift [ru]
Друзья, подскажите, а что с лекциями 4,5,6, так где профессор работает с FaceIt? Как действовать? Слушать лекции и воспроизводитель программу у себя по лекциям?

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

Ivan Lazarev

unread,
Jun 10, 2016, 3:51:24 AM6/10/16
to Swift [ru]
я обычно в 2 раза лекцию слушаю, во второй раз повторяю код

пятница, 10 июня 2016 г., 10:15:14 UTC+3 пользователь Лётчик Космос написал:

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

unread,
Jun 10, 2016, 7:06:32 AM6/10/16
to Swift [ru]
Подскажите, как поменять шрифт, размер, цвет для всех кнопок сразу?

пятница, 10 июня 2016 г., 10:51:24 UTC+3 пользователь Ivan Lazarev написал:

Ivan Lazarev

unread,
Jun 10, 2016, 7:08:08 AM6/10/16
to Swift [ru]
у меня получалось менять одновременно только для кнопок сгруппированных в одном стеке, может быть можно как-то ещё

пятница, 10 июня 2016 г., 14:06:32 UTC+3 пользователь Лётчик Космос написал:

tatiana.kornilova

unread,
Jun 10, 2016, 7:16:26 AM6/10/16
to Swift [ru]
Держите  Shift и выделяете кнопки, но, действительно, так как они в Stack View, то это работает только для кнопок в стэке. Можно держать  Shift и использовать мышку, но опять, если это не Stack View.

пятница, 10 июня 2016 г., 14:06:32 UTC+3 пользователь Лётчик Космос написал:

tatiana.kornilova

unread,
Jun 10, 2016, 10:25:50 AM6/10/16
to Swift [ru], tatiana....@gmail.com
Илья, я могла бы послать вам, как активному участнику форума, приглашение на просмотр русскоязычного конспекта лекций iOS 9, но не уверена, что вам это нужно, так как чувствуется, что вы свободно владеете английским и прекрасно понимаете все Лекции. Сообщите мне, если вы хотите получить такое приглашение.

четверг, 9 июня 2016 г., 8:09:42 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov (llodi)

unread,
Jun 10, 2016, 11:47:14 AM6/10/16
to Лётчик Космос, Swift [ru]
Татьяна, Доброй пятницы вам :)

я очень признателен за ваше предложение. я бы хотел иметь задания на русском.
Дело в том, что лекции я понимаю на 99%, а то что не понимаю и так понятно. В этом плане лекции идеальны как по уровню языка, так и по материалу, а лектор с его произношением вообще просто Бог!
а вот задания в противовес зачастую не понятны, и из-за этого я порой делаю ошибки либо допускаю не точности.


8 июня 2016 г., в 12:21, Лётчик Космос <lyot...@gmail.com> написал(а):

Доделал Undo.  Понял, почему получал странные результаты, если несколько раз нажать кнопку Undo. Дело в том, что при пересчитывании internalоrogram у меня не удалялась предыдущая программа, таким образом internaProgram разбухал. Нужно было добавить метод clear() в самое начало установки свойства program.

 var program: PropertyList

    {

        get {

            return internalProgram

        }

        set {

            clear()

            if let arrayOfOps = newValue as?[AnyObject] {


После этого удалось протестить работу команды cos(M) с помощью кнопки Undo, тоже всё работает:)


Есть несколько вопросов:

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

 Нужно ли в этом разбираться сейчас или это будет далее в курсе? Как вы пришли к такому решению, это best practice для работы с интерфейсом?


2. Во время отладки в Xcode использую Step Over и в определенный момент меня перебрасывает на assembler. Как этого избежать? я хочу отлаживать только swift код)


3. Интерфейс групп Google не очень дружелюбный на мой взгляд:) А мы не можем зарегистрироваться на Piazza и вести общение между собой там? Может быть есть еще какие-нибудь аналогичные площадки, где уже сидят люди, которые выполняют задания и обсуждают курс? Странно, что лично мне не удалось найти ничего подобного... Такое ощущения, что во всем рунете этот курс делают только трое:)) Я, Вы и Илья


вторник, 7 июня 2016 г., 12:04:21 UTC+3 пользователь Лётчик Космос написал:
   Да, можно убрать условие 

if variableValues[variableName] == nil 
И оставить просто строку operations[variableName] = Operation.Variable Этим условием я хотел сказать, что значение в словарь operations будет добавляться только один раз в момент добавления новой переменной. 
Думаю, это некритично, можно убрать, а можно и оставить, в обоих случаях работает.
На вопрос 3: ясно, спасибо, похоже сейчас у меня именно так и работает.В Undo ничего особенного не сделал, выглядит сейчас, также как у вас. Просто удаляю последнюю команду из списка команд. Но при тестировании этой команды иногда получаю непредсказуемые результаты. Планирую завтра над этим поработать, плюс попробую реализовать extra задание с обработчиком ошибок. Честно говоря, уже хочется идти дальше, но наверное нужно закрыть все вопросы по этому заданию...Мой гитхаб https://github.com/pposad/assignment2-2016-calculator.git
-- 
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/dbavaUYhriE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/5b158036-2aad-43de-86c2-eb01a53fa79f%40googlegroups.com.

tatiana.kornilova

unread,
Jun 10, 2016, 1:34:52 PM6/10/16
to Swift [ru], lyot...@gmail.com
Посылаю вам ссылку на Задания  iOS 9 пока переведено три Задания. В ближайшее время переведу остальные. 
Но Задание 3 iOS 9 - это практически то же самое, что Задание 3 iOS 8, 
Задание 4 iOS 9 - это практически то же самое, что Задание 4 iOS 8 и  
Задание 6 iOS 9 - это практически то же самое, что Задание 5 iOS 8, поэтому посылаю вам ссылку на Задания iOS 8.
Кроме того, можете посмотреть решения - там каждый пункт Задания цитируется и разъясняется, что имеется ввиду

------------



 
 

пятница, 10 июня 2016 г., 18:47:14 UTC+3 пользователь Ilya Dolgopolov написал:
   Да, можно убрать условие 


</span

Dolgopolov Ilya

unread,
Jun 10, 2016, 1:44:04 PM6/10/16
to tatiana.kornilova, Swift [ru]
Кстати я прочитал книгу на инглише по swift 2.2 всем советую, в интернете есть и на русском аналоги, но оригинал.
Прям влюбился в этот язык, но с дрогой стороны он требует другого подхода, нужно время чтобы научиться использовать его кул фичи.
К примеру частое использование enum и тп
 
10.06.2016, 17:25, "tatiana.kornilova" <tatiana....@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/dbavaUYhriE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/cf357a71-a45c-405b-b410-203cf5cb8cf5%40googlegroups.com.

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

Ivan Lazarev

unread,
Jun 10, 2016, 1:52:13 PM6/10/16
to Swift [ru]
Илья, поделитесь, пожалуйста, названием и автором книги

tatiana.kornilova

unread,
Jun 10, 2016, 2:28:37 PM6/10/16
to Swift [ru]
Это документация по Swift 2.2. "The Swift Programming Language (Swift 2.2)" Вы можете ее скачать из библиотеке в iBook (Mac, iPad)
Есть русские переводы этой книги, достаточно задать в Google "Swift русский". Но все таки, прочтите ее по-английски.
 



пятница, 10 июня 2016 г., 20:52:13 UTC+3 пользователь Ivan Lazarev написал:

Ivan Lazarev

unread,
Jun 10, 2016, 2:33:57 PM6/10/16
to Swift [ru]
Так это книга на которую профессор даёт reading assignment ... Конечно в оригинале

tatiana.kornilova

unread,
Jun 10, 2016, 2:36:05 PM6/10/16
to Swift [ru]
Да.

пятница, 10 июня 2016 г., 21:33:57 UTC+3 пользователь Ivan Lazarev написал:

Dolgopolov Ilya

unread,
Jun 10, 2016, 3:01:24 PM6/10/16
to tatiana.kornilova, Swift [ru]
но в особо сложных местах я пользовался для подстраховки ресурсом
http://swiftbook.ru
правда, английский все таки лучше, т.к. перевод там тож не совершенен 
 
10.06.2016, 21:36, "tatiana.kornilova" <tatiana....@gmail.com>:
Да.

пятница, 10 июня 2016 г., 21:33:57 UTC+3 пользователь Ivan Lazarev написал:
Так это книга на которую профессор даёт reading assignment ... Конечно в оригинале

 

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/dbavaUYhriE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/fba11c7f-c065-4219-89f1-5d0528555103%40googlegroups.com.

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

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

unread,
Jun 11, 2016, 9:32:09 AM6/11/16
to Swift [ru], tatiana....@gmail.com
Раз уж тут прошло обсуждение по языку, то есть вопрос.

Я сейчас изучаю swift, одновременно с этим проходя лекции и выполняя задания. Что делать дальше, когда закончится курс? 
По идее надо будет написать собственное приложение на swift, но как же быть с objective-c? Я так понимаю, без него никуда, если ты хочешь быть мобильным разработчиком под IOS?



пятница, 10 июня 2016 г., 22:01:24 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov (llodi)

unread,
Jun 11, 2016, 9:44:53 AM6/11/16
to Лётчик Космос, Swift [ru], tatiana....@gmail.com
Мне кажется если писать под новые версии то, вряд ли кто-то будет под обджект писать
а вообще по рынку да и то и другое в основном 
11 июня 2016 г., в 16:32, Лётчик Космос <lyot...@gmail.com> написал(а):

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/0f6f18a6-1cf2-4cd7-9e74-136ab37e88df%40googlegroups.com.

tatiana.kornilova

unread,
Jun 11, 2016, 10:10:02 AM6/11/16
to Swift [ru], tatiana....@gmail.com
Забудьте про Objective-C. Apple делает все, чтобы приложения писались целиком на Swift и пишут очень много. Беда заключается в том, что они очень динамично развивают Swift. Был Swift 1.1 - появился Swift 2.2 и внес кардинальные изменения. Сейчас Swift 2.2 и все довольны. Но сделали Open Source, посыпались действительно гениальные предложения и в конце года они объявили переход на Swift 3.0,  в котором такие изменения, что переход со Swift 1.1 на Swift 2.2 покажется "цветочками" по сравнению с переходом с Swift 2.2 на Swift 3.0.  Все сообщество просит повременить со Swift 3.0, но 13 июня конференция разработчиков и, похоже, Apple будет толкать Swift 3.0. А если у вас в приложении 20 000 строк кода? Конечно, автоматический период, но все же.
Что касается Objective-C, то очень много всего на нем написано, поэтому, если работа заключается в сопровождении старых приложений, то нужен Objective-C. Objective-C- блестящий язык, динамичный по сравнению со Swift, конечно, не такой безопасный, но синтаксис - ужасный со своими квадратными скобками. Въехать тяжело, поэтому мало было разработчиков на  Objective-C и зарплаты были заоблачные. 
У меня на сайте есть перевод и Задания последнего стэнфордского курса Developing iOS  7 Apps for iPhone and iPad, который читал тот же профессор  Paul Hegarty. Если любопытно, можете посмотреть - он в открытом доступе ( там кстати очень любопытное Задание 1 - карточная игра). Но предупреждаю, если вы начинаете с нуля - язык реально трудный.

суббота, 11 июня 2016 г., 16:32:09 UTC+3 пользователь Лётчик Космос написал:

Ilya Dolgopolov (llodi)

unread,
Jun 11, 2016, 10:17:32 AM6/11/16
to tatiana.kornilova, Swift [ru]
Спасибо за столь развернутое мнение!
Есть мнение одного моего друга, что и Swift не нужен, тк весьмир на JavaScript разрабатывает и на его производных, он всюду, и много на нем, от сайтов до приложений Андройда и Микрософта и может оказаться, что Апплу придется то ж к этому придти )
эт так информация к размышлению.. :)

11 июня 2016 г., в 17:10, tatiana.kornilova <tatiana....@gmail.com> написал(а):

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/2c319faf-1cef-4837-a916-5681906d932f%40googlegroups.com.

tatiana.kornilova

unread,
Jun 11, 2016, 10:29:13 AM6/11/16
to Swift [ru], tatiana....@gmail.com
А вот и нет. Swift реально проектируется очень талантливыми разработчиками и действительно язык с с беспрецедентными возможностями, недаром IBM его уже использует вовсю, есть Swift на Линуксе и сервера пишут на Swift. Нас ждут реально сложные приложения и нужен новый инструмент, а Swift под это и заточен. Что касается вашего друга, то боюсь он останется с Java, как в свое время остались за бортом те, кто сильно настаивали на Fortran,  а не хотели изучать C.

суббота, 11 июня 2016 г., 17:17:32 UTC+3 пользователь Ilya Dolgopolov написал:
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+unsubscribe@googlegroups.com.

Ilya Dolgopolov (llodi)

unread,
Jun 11, 2016, 10:30:25 AM6/11/16
to tatiana.kornilova, Swift [ru]
Вот поэтому меня не тянет на Java ) а тянет на swift ;)
11 июня 2016 г., в 17:29, tatiana.kornilova <tatiana....@gmail.com> написал(а):

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/c79ff39c-8efe-4b97-b5b9-272ccc5b365f%40googlegroups.com.

Ilya Dolgopolov

unread,
Jun 11, 2016, 12:46:33 PM6/11/16
to Swift [ru]
Еще раз хотел задать вопрос, как-то он уходит из внимания (попытка номер 3))): 

в своей первоначальное реализации кнопки C (clean) я выполнял создание нового объекта CalculatorBrain, и в самом  CalculatorBrain я запускал деинициализатор, чтобы убедиться, что каждый раз когда я нажимаю С, объект пересоздается. в Swift отсутствует сборщик мусора, swift подсчитывает количество ссылок, и если они отсутствуют память высвобождается. А для CalculatorBrainкак раз нет strong reference, поэтому я подумал это более аккуратный способ реализации который занимает одну строку кода. 
Хотелось бы услышать ваши комментарии на этот счет?

tatiana.kornilova

unread,
Jun 11, 2016, 2:43:47 PM6/11/16
to Swift [ru]
Давайте вспомним объектно-ориентированное программирование. У вас есть класс ViewController (или CalculatorViewController)

class ViewController: UIViewController {

    @IBOutlet weak var history: UILabel!

    @IBOutlet private weak var display: UILabel!

    

    private var userIsInTheMiddleOfTyping = false

.........

    private var brain = CalculatorBrain()

.........
 У этого класса есть переменные экземпляра класса (или если следовать терминологии Swift "хранимые" свойства), в том числе и переменная  brain, которая является экземпляром класса CalculatorBrain и как все  vars является strong по умолчанию. Она является неотъемлемой частью экземпляра класса ViewController и уйдет из памяти вместе с ним. Но если экземпляр класса ViewController "живет", то ему постоянно нужна ссылка на экземпляр CalculatorBrain. Поэтому ни в коем случае не нужно пересоздавать его на протяжении жизни экземпляра класса ViewController. 
Написали var brain, присвоили ему значение и все, от вас больше ничего не требуется. Остальное делает компилятор Swift.
Вы можете управлять своим экземпляром brain только через его программный интерфейс (API), то есть через public свойства и методы. 
Кнопка "C" призвана устанавливать в начальное состояние уже существующий экземпляр brain, то есть манипулировать vars   accumulator, pending, internalProgram
Для этого вы даете CalculatorBrain специальный метод

 func clear() {

        accumulator = 0.0

        pending = nil

        internalProgram.removeAll(keepCapacity: false)

    }

 А вот кнопка "C" вызывает уже этот public метод уже существующего экземпляра brain

  @IBAction func clearAll(sender: UIButton) {

        brain.clearVariables()

        brain.clear()

        displayValue = nil

    }

 Вам вообще не нужно думать об освобождении памяти в Swift в Заданиях 1 и 2. 
 Вы немного перемудрили.
суббота, 11 июня 2016 г., 19:46:33 UTC+3 пользователь Ilya Dolgopolov написал:

Ivan Lazarev

unread,
Jun 22, 2016, 4:37:22 PM6/22/16
to Swift [ru]
Всем привет!
Наконец-то руки дошли до задания 2, реализовал кнопки M и →M.
Посмотрите, пожалуйста :) хотелось бы понять, на верном ли я пути, чтобы двигаться дальше

Ivan Lazarev

unread,
Jun 22, 2016, 4:38:21 PM6/22/16
to Swift [ru]
вот, собственно, ссылка https://github.com/ballard/calculatorMVC-V2

среда, 22 июня 2016 г., 23:37:22 UTC+3 пользователь Ivan Lazarev написал:

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

unread,
Jun 25, 2016, 10:34:41 AM6/25/16
to Swift [ru]
Друзья, к сожалению, я вынужден временно покинуть наш дружный коллектив. Прохождение курса смогу возобновить только в сентябре(
Всем хорошего лета)

среда, 22 июня 2016 г., 23:38:21 UTC+3 пользователь Ivan Lazarev написал:

tatiana.kornilova

unread,
Jun 25, 2016, 11:05:44 AM6/25/16
to Swift [ru]
Возвращайтесь. Нам Вас Будет не хватать. Приятного отдыха.

суббота, 25 июня 2016 г., 17:34:41 UTC+3 пользователь Лётчик Космос написал:

Ivan Lazarev

unread,
Jul 1, 2016, 12:09:34 PM7/1/16
to Swift [ru]
если кому-то еще интересно, моя реализация задания 2: https://github.com/ballard/calculatorMVC-V2
Reply all
Reply to author
Forward
0 new messages