@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 - они практически одинаковые:
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 у вас сделана правильно.
Нужно использовать Compression Resistance Priority как говорится в подсказке №7 Задания 1
Кроме того, профессор не любит "магических" чисел, так что установите либо в Standard, либо в 0
Всем привет
func undoLast() {
guard !internalProgram.isEmpty else { return }
internalProgram.removeLast()
program = internalProgram
}
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] = ....
и т.д.
if variableValues[variableName] == nil {
variableValues[variableName] = 0.0
}
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 пользователь Лётчик Космос написал:
Всем привет
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).
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "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.
accumulator = variableValues[symbol]!
descriptionAccumulator = symbol
Но по-моему это не очень хороший способ.
Ознакомился с вашим решением, наверное надо сделать как у Вас, оно понятное и универсальное.
Всем привет
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
}
func setOperand(variable: String) {
internalProgram.append(variable)
if operations[variable] == nil {
operations[variable] = Operation.Variable(variable)
}
performOperation(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
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)
}
}
}
}
}
@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
}
А затем два раза кликнуть на Calculator.xcodeproj
Посмотрите, может быть у вас будут какие-то предложения.
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)
accumulator = variableValues<span style="c
func setOperand(variable: String) {
operations[variable] = Operation.Variable
performOperation(variable)
}
func setVariable(symbol: String, value: Double) {
variableValues[symbol] = value
}
Пусть "сидит" в словаре значений до поры, до времени.
| if variableValues[variableName] == nil |
|
И оставить просто строку
operations[variableName] = Operation.Variable
Этим условием я хотел сказать, что значение в словарь operations будет добавляться только один раз в момент добавления новой переменной.
Думаю, это некритично, можно убрать, а можно и оставить, в обоих случаях работает. На вопрос 3: ясно, спасибо, похоже сейчас у меня именно так и работает. В Undo ничего особенного не сделал, выглядит сейчас, также как у вас. Просто удаляю последнюю команду из списка команд. Но при тестировании этой команды иногда получаю непредсказуемые результаты. Планирую завтра над этим поработать, плюс попробую реализовать extra задание с обработчиком ошибок. Честно говоря, уже хочется идти дальше, но наверное нужно закрыть все вопросы по этому заданию... Мой гитхаб https://github.com/pposad/assignment2-2016-calculator.git |
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 и вести общение между собой там? Может быть есть еще какие-нибудь аналогичные площадки, где уже сидят люди, которые выполняют задания и обсуждают курс? Странно, что лично мне не удалось найти ничего подобного... Такое ощущения, что во всем рунете этот курс делают только трое:)) Я, Вы и Илья
Да, можно убрать условие
Хорошо, что вы сделали &q
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "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.
var program: PropertyList {
get {
return internalProgram
}
set{
clear()
...........
Да, можно убрать условие
Конечно, мы принимаем вас в нашу команду - это шутка.
Да, можно убрать условие
Не работает последовательность действий: M, Cos, π, ->M, <=
Да, можно убрать условие
}</spa
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
}
}
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
]
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
}
}
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
}
}
}
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.
Да, можно убрать условие
</span
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "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.
Да.
пятница, 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.
11 июня 2016 г., в 16:32, Лётчик Космос <lyot...@gmail.com> написал(а):
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/0f6f18a6-1cf2-4cd7-9e74-136ab37e88df%40googlegroups.com.
11 июня 2016 г., в 17:10, tatiana.kornilova <tatiana....@gmail.com> написал(а):
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/2c319faf-1cef-4837-a916-5681906d932f%40googlegroups.com.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+unsubscribe@googlegroups.com.
11 июня 2016 г., в 17:29, tatiana.kornilova <tatiana....@gmail.com> написал(а):
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/c79ff39c-8efe-4b97-b5b9-272ccc5b365f%40googlegroups.com.
class ViewController: UIViewController {
@IBOutlet weak var history: UILabel!
@IBOutlet private weak var display: UILabel!
private var userIsInTheMiddleOfTyping = false
.........
private var brain = CalculatorBrain()
func clear() {
accumulator = 0.0
pending = nil
internalProgram.removeAll(keepCapacity: false)
}
@IBAction func clearAll(sender: UIButton) {
brain.clearVariables()
brain.clear()
displayValue = nil
}