help@rskworld.in +91 93305 39277
RSK World
  • Home
  • Development
    • Web Development
    • Mobile Apps
    • Software
    • Games
    • Project
  • Technologies
    • Data Science
    • AI Development
    • Cloud Development
    • Blockchain
    • Cyber Security
    • Dev Tools
    • Testing Tools
  • About
  • Contact

Theme Settings

Color Scheme
Display Options
Font Size
100%
Back to Project
RSK World
swift-ios-calculator
RSK World
swift-ios-calculator
Swift iOS Calculator v1.0 - AI Math Solver + 3D Graphing + Apple Watch Integration + iOS Widgets + Siri Shortcuts + Currency Converter + Scientific Calculator + Matrix Operations + Platform Integration + Modern iOS Development
swift-ios-calculator
  • Assets.xcassets
  • Base.lproj
  • swift-ios-calculator.xcodeproj
  • AIMathSolverViewController.swift26.6 KB
  • AppDelegate.swift1.7 KB
  • CalculatorHistoryViewController.swift6.5 KB
  • CalculatorLogic.swift4.4 KB
  • CalculatorSettingsViewController.swift5.6 KB
  • CalculatorTheme.swift8.3 KB
  • CalculatorUtils.swift6.9 KB
  • CalculatorViewController.swift3.4 KB
  • CalculatorWidget.swift14.3 KB
  • CalculatorWidgetInfo.plist846 B
  • ChemistryCalculatorViewController.swift26.9 KB
  • CurrencyConverterViewController.swift13.3 KB
  • CustomFormulaBuilderViewController.swift22.1 KB
  • EngineeringCalculatorViewController.swift25.7 KB
  • EquationSolverViewController.swift22.8 KB
  • FinancialCalculatorViewController.swift27.5 KB
  • GeometryCalculatorViewController.swift29.7 KB
  • Graphing3DViewController.swift20.8 KB
  • GraphingCalculatorViewController.swift14.7 KB
  • Info.plist3.2 KB
  • LICENSE1.1 KB
  • MainTabBarController.swift22.3 KB
  • MatrixCalculatorViewController.swift26.6 KB
  • PRIVACY_POLICY.md1.6 KB
  • PhysicsCalculatorService.swift8.2 KB
  • ProgrammerCalculatorViewController.swift11 KB
  • README.md8.7 KB
  • RELEASE_NOTES.md6.5 KB
  • SceneDelegate.swift2.8 KB
  • ScientificCalculatorViewController.swift6.2 KB
  • SiriShortcutsManager.swift23.5 KB
  • Swift iOS Calculator.entitlements1.1 KB
  • UnitConverterViewController.swift14 KB
  • WatchCalculatorViewController.swift15.3 KB
  • index.html47.5 KB
AppDelegate.swiftUnitConverterViewController.swift
AppDelegate.swift
Raw Download
Find: Go to:
//
//  AppDelegate.swift
//  Swift iOS Calculator
//
//  Created by RSK World on 23/01/2026.
//  Copyright © 2026 RSK World. All rights reserved.
//
//  Developer: Molla Samser (Founder, RSK World)
//  Designer & Tester: Rima Khatun
//  Contact: info@rskworld.com, +91 93305 39277
//  Website: https://rskworld.in
//  Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India - 713147
//

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}
38 lines•1.7 KB
swift
UnitConverterViewController.swift
Raw Download
Find: Go to:
//
//  UnitConverterViewController.swift
//  Swift iOS Calculator
//
//  Created by RSK World on 23/01/2026.
//  Copyright © 2026 RSK World. All rights reserved.
//
//  Developer: Molla Samser (Founder, RSK World)
//  Designer & Tester: Rima Khatun
//  Contact: info@rskworld.com, +91 93305 39277
//  Website: https://rskworld.in
//  Address: Nutanhat, Mongolkote, Purba Burdwan, West Bengal, India - 713147
//

import UIKit

class UnitConverterViewController: UIViewController {
    
    // MARK: - Outlets
    @IBOutlet weak var categorySegmentedControl: UISegmentedControl!
    @IBOutlet weak var fromUnitTextField: UITextField!
    @IBOutlet weak var toUnitTextField: UITextField!
    @IBOutlet weak var fromUnitPickerView: UIPickerView!
    @IBOutlet weak var toUnitPickerView: UIPickerView!
    @IBOutlet weak var resultLabel: UILabel!
    @IBOutlet weak var swapButton: UIButton!
    
    // MARK: - Properties
    private let conversionCategories = ["Length", "Weight", "Temperature", "Volume", "Area", "Speed", "Time"]
    private let lengthUnits = ["Meter", "Kilometer", "Centimeter", "Millimeter", "Mile", "Yard", "Foot", "Inch"]
    private let weightUnits = ["Kilogram", "Gram", "Milligram", "Pound", "Ounce", "Ton", "Stone"]
    private let temperatureUnits = ["Celsius", "Fahrenheit", "Kelvin", "Rankine"]
    private let volumeUnits = ["Liter", "Milliliter", "Gallon", "Quart", "Pint", "Cup", "Fluid Ounce"]
    private let areaUnits = ["Square Meter", "Square Kilometer", "Square Foot", "Square Inch", "Hectare", "Acre"]
    private let speedUnits = ["Meter/Second", "Kilometer/Hour", "Mile/Hour", "Knot", "Foot/Second"]
    private let timeUnits = ["Second", "Minute", "Hour", "Day", "Week", "Month", "Year"]
    
    private var currentUnits: [String] = []
    private var selectedFromUnit = 0
    private var selectedToUnit = 1
    
    // MARK: - Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        setupPickerViews()
        selectCategory(0)
    }
    
    // MARK: - Setup
    private func setupUI() {
        title = "Unit Converter"
        view.backgroundColor = CalculatorTheme.shared.backgroundColor
        
        // Setup segmented control
        categorySegmentedControl.removeAllSegments()
        for (index, category) in conversionCategories.enumerated() {
            categorySegmentedControl.insertSegment(withTitle: category, at: index, animated: false)
        }
        categorySegmentedControl.selectedSegmentIndex = 0
        categorySegmentedControl.backgroundColor = CalculatorTheme.shared.buttonBackgroundColor
        categorySegmentedControl.selectedSegmentTintColor = CalculatorTheme.shared.accentColor
        categorySegmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: CalculatorTheme.shared.textColor], for: .normal)
        categorySegmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .selected)
        
        // Setup text fields
        fromUnitTextField.backgroundColor = CalculatorTheme.shared.displayBackgroundColor
        fromUnitTextField.textColor = CalculatorTheme.shared.textColor
        fromUnitTextField.layer.cornerRadius = 12
        fromUnitTextField.layer.borderWidth = 1
        fromUnitTextField.layer.borderColor = CalculatorTheme.shared.buttonBackgroundColor.cgColor
        
        toUnitTextField.backgroundColor = CalculatorTheme.shared.displayBackgroundColor
        toUnitTextField.textColor = CalculatorTheme.shared.textColor
        toUnitTextField.layer.cornerRadius = 12
        toUnitTextField.layer.borderWidth = 1
        toUnitTextField.layer.borderColor = CalculatorTheme.shared.buttonBackgroundColor.cgColor
        
        // Setup result label
        resultLabel.backgroundColor = CalculatorTheme.shared.accentColor
        resultLabel.textColor = .white
        resultLabel.layer.cornerRadius = 12
        resultLabel.layer.masksToBounds = true
        resultLabel.textAlignment = .center
        resultLabel.font = UIFont.systemFont(ofSize: 24, weight: .medium)
        
        // Setup swap button
        swapButton.backgroundColor = CalculatorTheme.shared.buttonBackgroundColor
        swapButton.setTitleColor(CalculatorTheme.shared.textColor, for: .normal)
        swapButton.layer.cornerRadius = 25
        swapButton.setTitle("⇄", for: .normal)
        swapButton.titleLabel?.font = UIFont.systemFont(ofSize: 20)
    }
    
    private func setupPickerViews() {
        fromUnitPickerView.delegate = self
        fromUnitPickerView.dataSource = self
        toUnitPickerView.delegate = self
        toUnitPickerView.dataSource = self
    }
    
    // MARK: - Actions
    @IBAction func categoryChanged(_ sender: UISegmentedControl) {
        selectCategory(sender.selectedSegmentIndex)
    }
    
    @IBAction func fromUnitChanged(_ sender: UITextField) {
        performConversion()
    }
    
    @IBAction func swapUnits(_ sender: UIButton) {
        let tempUnit = selectedFromUnit
        selectedFromUnit = selectedToUnit
        selectedToUnit = tempUnit
        
        fromUnitPickerView.selectRow(selectedFromUnit, inComponent: 0, animated: true)
        toUnitPickerView.selectRow(selectedToUnit, inComponent: 0, animated: true)
        
        performConversion()
    }
    
    // MARK: - Methods
    private func selectCategory(_ index: Int) {
        switch index {
        case 0: currentUnits = lengthUnits
        case 1: currentUnits = weightUnits
        case 2: currentUnits = temperatureUnits
        case 3: currentUnits = volumeUnits
        case 4: currentUnits = areaUnits
        case 5: currentUnits = speedUnits
        case 6: currentUnits = timeUnits
        default: currentUnits = lengthUnits
        }
        
        selectedFromUnit = 0
        selectedToUnit = min(1, currentUnits.count - 1)
        
        fromUnitPickerView.reloadAllComponents()
        toUnitPickerView.reloadAllComponents()
        fromUnitPickerView.selectRow(selectedFromUnit, inComponent: 0, animated: false)
        toUnitPickerView.selectRow(selectedToUnit, inComponent: 0, animated: false)
        
        performConversion()
    }
    
    private func performConversion() {
        guard let inputText = fromUnitTextField.text, let inputValue = Double(inputText) else {
            resultLabel.text = "Enter a value"
            return
        }
        
        let category = categorySegmentedControl.selectedSegmentIndex
        let fromUnit = currentUnits[selectedFromUnit]
        let toUnit = currentUnits[selectedToUnit]
        
        let result = convert(value: inputValue, from: fromUnit, to: toUnit, category: category)
        resultLabel.text = String(format: "%.6f", result)
    }
    
    private func convert(value: Double, from: String, to: String, category: Int) -> Double {
        // Convert to base unit first, then to target unit
        let baseValue = convertToBase(value: value, unit: from, category: category)
        return convertFromBase(value: baseValue, unit: to, category: category)
    }
    
    private func convertToBase(value: Double, unit: String, category: Int) -> Double {
        switch category {
        case 0: // Length
            switch unit {
            case "Meter": return value
            case "Kilometer": return value * 1000
            case "Centimeter": return value / 100
            case "Millimeter": return value / 1000
            case "Mile": return value * 1609.34
            case "Yard": return value * 0.9144
            case "Foot": return value * 0.3048
            case "Inch": return value * 0.0254
            default: return value
            }
        case 1: // Weight
            switch unit {
            case "Kilogram": return value
            case "Gram": return value / 1000
            case "Milligram": return value / 1000000
            case "Pound": return value * 0.453592
            case "Ounce": return value * 0.0283495
            case "Ton": return value * 1000
            case "Stone": return value * 6.35029
            default: return value
            }
        case 2: // Temperature
            switch unit {
            case "Celsius": return value
            case "Fahrenheit": return (value - 32) * 5/9
            case "Kelvin": return value - 273.15
            case "Rankine": return (value - 491.67) * 5/9
            default: return value
            }
        case 3: // Volume
            switch unit {
            case "Liter": return value
            case "Milliliter": return value / 1000
            case "Gallon": return value * 3.78541
            case "Quart": return value * 0.946353
            case "Pint": return value * 0.473176
            case "Cup": return value * 0.236588
            case "Fluid Ounce": return value * 0.0295735
            default: return value
            }
        case 4: // Area
            switch unit {
            case "Square Meter": return value
            case "Square Kilometer": return value * 1000000
            case "Square Foot": return value * 0.092903
            case "Square Inch": return value * 0.00064516
            case "Hectare": return value * 10000
            case "Acre": return value * 4046.86
            default: return value
            }
        case 5: // Speed
            switch unit {
            case "Meter/Second": return value
            case "Kilometer/Hour": return value / 3.6
            case "Mile/Hour": return value * 0.44704
            case "Knot": return value * 0.514444
            case "Foot/Second": return value * 0.3048
            default: return value
            }
        case 6: // Time
            switch unit {
            case "Second": return value
            case "Minute": return value * 60
            case "Hour": return value * 3600
            case "Day": return value * 86400
            case "Week": return value * 604800
            case "Month": return value * 2629746
            case "Year": return value * 31556952
            default: return value
            }
        default: return value
        }
    }
    
    private func convertFromBase(value: Double, unit: String, category: Int) -> Double {
        switch category {
        case 0: // Length
            switch unit {
            case "Meter": return value
            case "Kilometer": return value / 1000
            case "Centimeter": return value * 100
            case "Millimeter": return value * 1000
            case "Mile": return value / 1609.34
            case "Yard": return value / 0.9144
            case "Foot": return value / 0.3048
            case "Inch": return value / 0.0254
            default: return value
            }
        case 1: // Weight
            switch unit {
            case "Kilogram": return value
            case "Gram": return value * 1000
            case "Milligram": return value * 1000000
            case "Pound": return value / 0.453592
            case "Ounce": return value / 0.0283495
            case "Ton": return value / 1000
            case "Stone": return value / 6.35029
            default: return value
            }
        case 2: // Temperature
            switch unit {
            case "Celsius": return value
            case "Fahrenheit": return value * 9/5 + 32
            case "Kelvin": return value + 273.15
            case "Rankine": return value * 9/5 + 491.67
            default: return value
            }
        case 3: // Volume
            switch unit {
            case "Liter": return value
            case "Milliliter": return value * 1000
            case "Gallon": return value / 3.78541
            case "Quart": return value / 0.946353
            case "Pint": return value / 0.473176
            case "Cup": return value / 0.236588
            case "Fluid Ounce": return value / 0.0295735
            default: return value
            }
        case 4: // Area
            switch unit {
            case "Square Meter": return value
            case "Square Kilometer": return value / 1000000
            case "Square Foot": return value / 0.092903
            case "Square Inch": return value / 0.00064516
            case "Hectare": return value / 10000
            case "Acre": return value / 4046.86
            default: return value
            }
        case 5: // Speed
            switch unit {
            case "Meter/Second": return value
            case "Kilometer/Hour": return value * 3.6
            case "Mile/Hour": return value / 0.44704
            case "Knot": return value / 0.514444
            case "Foot/Second": return value / 0.3048
            default: return value
            }
        case 6: // Time
            switch unit {
            case "Second": return value
            case "Minute": return value / 60
            case "Hour": return value / 3600
            case "Day": return value / 86400
            case "Week": return value / 604800
            case "Month": return value / 2629746
            case "Year": return value / 31556952
            default: return value
            }
        default: return value
        }
    }
}

// MARK: - UIPickerViewDelegate & UIPickerViewDataSource
extension UnitConverterViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return currentUnits.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return currentUnits[row]
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == fromUnitPickerView {
            selectedFromUnit = row
        } else {
            selectedToUnit = row
        }
        performConversion()
    }
}
347 lines•14 KB
swift

About RSK World

Founded by Molla Samser, with Designer & Tester Rima Khatun, RSK World is your one-stop destination for free programming resources, source code, and development tools.

Founder: Molla Samser
Designer & Tester: Rima Khatun

Development

  • Game Development
  • Web Development
  • Mobile Development
  • AI Development
  • Development Tools

Legal

  • Terms & Conditions
  • Privacy Policy
  • Disclaimer

Contact Info

Nutanhat, Mongolkote
Purba Burdwan, West Bengal
India, 713147

+91 93305 39277

hello@rskworld.in
support@rskworld.in

© 2026 RSK World. All rights reserved.

Content used for educational purposes only. View Disclaimer