Калькулятор на Swift Xcode

Много лет хотел начать программировать под OSX. Я люблю эту ОС за ее красивый UI, за его плавность. Открывая Xcode так и хочется чего-нибудь напрограммировать. Читал много туториалов как начать программировать на Objective-C, но как только начинал пробовать выполнять примеры натыкался на «соединение» интерфейса с кодом. Для меня, привыкшего к VS, это просто другой подход. Мне до сих пор непонятно почему нельзя сделать так: перетащил кнопку с палитры компонентов, два раза кликнул, обработчик готов, начинай. Тут нет. Видимо это так и останется для меня загадкой. Ну да ладно. Начнем.

Создадим приложение калькулятор. Это чуть сложнее чем классический «Hello World!», но и интереснее. В проекте будет несколько кнопок и текстовая метка. Будут рассмотрены важные для начинающих моменты, такие как: как обратиться к элементу на форме; как записать значение из элемента формы в переменную; создание обработчиков кнопок; «связывание» элементов на форме с кодом.

Создаем новый проект для OS X, выбираем Cocoa Application

Creating Xcode project

На следующем шаге задаем имя проекта. Выбираем язык Swift. Core Data здесь не нужны.

Naming

Проект готов. Мы попадаем в окно со свойствами проекта.

Project settings

В свойствах ничего не изменяем. Переходим сразу к созданию пользовательского интерфейса.

Start creating UI

Перетащим на форму Label и несколько кнопок. Расположим их, например как на рисунке.

Configure ui

Переходим к самому интересному, связыванию элементов формы и кода. Для этого придумали Assistant editor. Выполняем View->Assistant Editor->Show Assistant editor. Окно свойств элементов формы можно закрыть. Для этого выполним View->Utilities->Hide Utilities.

В окне с кодом файла ViewController.swift удалим лишний созданый средой Xcode код и приведем код к такому виду.

//
//  ViewController.swift
//  calc
//
//  Created by user on 26.03.15.
//  Copyright (c) 2015 user. All rights reserved.
//

import Cocoa

class ViewController: NSViewController {

    
    
}

Зажмем клавишу control и нажмем левой кнопкой мыши на label и перетащим курсов в область кода внутрь класса ViewController.

connect label with code

Отпустим все кнопки и появится окно со свойствами соединения. Необходимо выбрать outlet. Т.к. метка не нуждается в действии и задать имя.

configure outlet

В результате код приобрете следующий вид.

import Cocoa

class ViewController: NSViewController {
    @IBOutlet weak var display: NSTextField!   
}

Добавиться строка

@IBOutlet weak var display: NSTextField!

Точно так же поступим и с кнопками. Выделим их все. Зажмем control и перетащим в окно кода. Создадим Action. Зададим имя и выберем отправителя NSButton.

create action

Код будет выглядеть следующим образом.

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var display: NSTextField!

    @IBAction func addDigit(sender: NSButton) {
    }
}

Action добавлен в виде функции addDigit. Это и есть обработчик нажатия кнопки. В данном случае это Action. Нет необходимости создавать отдельные обработчики для каждой кнопки, т.к. в функцию передается объект, ее вызвавший.

sender: NSButton

У него можно посмотреть свойства и получить какая это цифра. Для действий (умножение, сложение…) создадим отдельные Action. Можно и не создавать, но я решил создать. В результате код будет ViewController.swift будет выглядеть следующим образом.

//
//  ViewController.swift
//  calc
//
//  Created by user on 26.03.15.
//  Copyright (c) 2015 user. All rights reserved.
//

import Cocoa

class ViewController: NSViewController {
    
    //атутлет для NSTextFiled
    //далле обращаемся к нему по имени display
    @IBOutlet weak var display: NSTextField!
    
    //переменная хранит, начали ли печатать
    var notstarttyping : Bool = false
    
    //action для цифр
    @IBAction func addnumber(sender: NSButton) {
        //константа для цифры
        //берем ее из свойства title вызвавшей этот action кнопки
        let digit = sender.title
        
        //если начали печатать
        if (notstarttyping == false) {
            //сотрем 0 и присвоим цифру
            display.stringValue = digit
            notstarttyping = true
            
        } else {
            //добавим к существующему значению цифру
            display.stringValue =  display.stringValue + digit
        }
    }
    
    //первая часть выражения
    var firstval : Float = 0
    //вторая часть выражения
    var secondval : Float = 0
    //результат
    var resultat : Float = 0
    //что это за действие
    var act : NSString = "0"
    
    //обработка сложения
    @IBAction func plusact(sender: NSButton) {
        //присвоим первой части то что написано в display
        //конвертируем NSString во float
        firstval = (display.stringValue as NSString).floatValue
        //покажем, что это сложение
        act = "+"
        //очистим display
        display.stringValue =  ""
        
    }
    
    //обработка вычитания
    @IBAction func minusact(sender: NSButton) {
        //присвоим первой части то что написано в display
        //конвертируем NSString во float
        firstval = (display.stringValue as NSString).floatValue
        //покажем, что это вычитание
        act = "-"
        //очистим display
        display.stringValue =  ""
    }
    
    //обработка умножения
    @IBAction func umnact(sender: NSButton) {
        //присвоим первой части то что написано в display
        //конвертируем NSString во float
        firstval = (display.stringValue as NSString).floatValue
        //покажем, что это умножение
        act = "*"
        //очистим display
        display.stringValue =  ""
    }
    
    //обработка деления
    @IBAction func delit(sender: NSButton) {
        //присвоим первой части то что написано в display
        //конвертируем NSString во float
        firstval = (display.stringValue as NSString).floatValue
        //покажем, что это деление
        act = "/"
        //очистим display
        display.stringValue =  ""
    }
    
    //очистка, обработка C
    @IBAction func clearact(sender: NSButton) {
        //обнулим все переменные
        firstval = 0
        secondval = 0
        act = ""
        //очистим display
        display.stringValue =  ""
    }
    
    //обработка "равно"
    @IBAction func ravnoact(sender: NSButton) {
        //присваиваем второй части выражения, то что написано в display
        secondval = (display.stringValue as NSString).floatValue
        
        //смотрим какое это действие и выполняем его
        //результат записываем в переменную resultat
        if (act == "+") {
            resultat = firstval + secondval
        }
        
        if (act == "-") {
            resultat = firstval - secondval
        }
        
        if (act == "*") {
            resultat = firstval * secondval
        }
        
        if (act == "/") {
            resultat = firstval / secondval
        }
        
        //присваиваем значение переменной resultat метке
        display.floatValue = resultat
        
    }
    
}

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.