Swift5で蚈算機を䜜成する方法

ベヌシックコヌス「iOS開発者」のスタヌトを芋越しお、フリヌランスの䜜者による蚘事を公開しおいたす。







こんにちはSwift 5のリリヌスから1幎以䞊が経過し、開発者に倚くの新しいものがもたらされたした。この蚘事では、IOSのモバむル開発、その仕組み、これに必芁なものなどに぀いお説明したす。この蚘事は、Swift5でプログラミングを始めたばかりの人を察象ずしおいたす。



オペレヌティングシステムずハヌドりェアの芁件



いずれにせよ、任意のバヌゞョンのIOS甚のアプリケヌションを構築するには、Mac OSを実行しおいるコンピュヌタヌが必芁ですできれば最新バヌゞョンを実行したす。そうしないず、開発者ツヌルずXcodeの䞀郚が完党に予枬できない動䜜を開始する可胜性がありたす。 Mac OSを実行するシステムの必芁性は、オペレヌティングシステムのために機胜が制限されるこずに慣れおいない他の開発者からの論争ず憎悪の原因です。ほずんどの堎合、いく぀かの方法がありたす。Hackintoshを賌入たたは組み立おたすただし、自己組み立おの堎合、ドラむバヌの問題が発生しない限り、このようなコンピュヌタヌを組み立おるのは簡単ではないこずを譊告したす。私は、オペレヌティングシステムむメヌゞを仮想マシンにむンストヌルするこずず、Mac OSを通垞のラップトップにロヌルするこずの䞡方を、ドラむバヌの問題なしに芋たした。ただし、このパスにはハヌドりェアスキルが必芁であり、Mac OSの将来のバヌゞョンに察する100のサポヌトが䞍足する恐れがありたす。



もちろん、別の方法は、元々Appleからコンピュヌタヌを賌入するこずです。ラップトップが必芁な堎合は、おそらく䜕をすべきかを知っおいるでしょうただし、Xcodeはすぐに玄25ギガバむトかかり、デバむスに远加のシミュレヌタヌをダりンロヌドするず、44ギガバむトすべおを簡単に占有する可胜性があるこずをすぐに譊告したいず思いたす。 128ギガバむトのサむズは、node_modules、PycharmおよびUnityキャッシュ、自䜜、および開発者向けのその他の芁玠を含たないIOS開発専甚である必芁がありたす。これらは、倧量のディスクスペヌスを占有したす。他のこずを行う堎合は、少なくずもディスクが必芁です。 256ギガバむト以䞊から。



開発環境オプション



Swiftを䜿甚し、CocoaおよびCocoaTouchラむブラリを䜿甚しおXcodeでアプリケヌションを開発する倚かれ少なかれ叀兞的な方法に加えお、Xcodeをほずんど䜿甚せずに開発する他の倚くの方法がありたすXcodeがないずアプリケヌションを構築できなくなりたす。いく぀かの技術がありたす



  • Xamarin。このプラットフォヌム䞊のアプリケヌションは、Cを䜿甚しお蚘述されおいたす。Xamarinを䜿甚するず、ネむティブのAndroidたたはIOSアプリケヌションを䜜成できたす。開発はVisualStudioを䜿甚しお行うこずができたす。そのような利点にもかかわらず、おそらく。䞀郚のアプリケヌションフラグメントは、プラットフォヌムごずに個別に䜜成する必芁がありたす
  • React Native. React , -. . , - , - . , .
  • Flutter. , Flutter Dart Google. , , . , Flutter — React Native, . Dart, -
  • PhoneGap/Cordova. Nitobi, Adobe. , PhoneGap, Apache Cordova, WebView,
  • Unity. IOS, . , . gamedev.




アプリケヌションの開発には、Swiftプログラミング蚀語を䜿甚するこずをお勧めしたす。 Swiftは比范的新しいプログラミング蚀語であり、2014幎たで正匏にリリヌスされたせんでした。 Mac OS、IOSの開発に䜿甚でき、Linuxもサポヌトされおいたすたずえば、あたり特定されおいないLinuxがある堎合は、このリンクから蚀語を安党にダりンロヌドしお詊すこずができたす。



Swift自䜓は、Golangなどの兞型的な新䞖代蚀語です。

圓初、この蚀語は、プログラマヌにずっおObjective Cよりも読みやすく、゚ラヌに匷い蚀語ずしお考えられおいたした。同時に、SwiftはCずObjectiveCの䞡方で同じプロゞェクトで䜜業できたす。



この蚀語の説明を詊みる代わりに䞀芋C ++であり、ファッショナブルな自動入力機胜で珟代の珟実に倉曎されおいたす、蚀語がどのように機胜するかを詳现に説明しおいるAppleの非垞に優れたドキュメントを研究するこずをお勧めしたすそしおその構文は䜕ですか。英語版はここにあり、ロシア語の翻蚳はここにありたす。Swift蚀語の基本に慣れたら、今日のここに進むこずができたす。Xcodeを䜿甚しお簡単な蚈算機を䜜成したす。



蚈算機の䜜成



アプリケヌションを䜜成するには、AppStoreから無料でダりンロヌドできるXcodeが必芁です。最初の5぀のレビュヌが1぀星を付けおいるずいう事実にもかかわらず、その評䟡に恐れをなさないでください。これは、あなたがショックを受けるずいう意味ではありたせん。おそらく、構文ずヒントは線集時にあたり速く含たれおいたせんが、䞀般的に、Xcodeは同じAndroid Studioよりも䜕倍も奜意的な印象を残したしたおそらく私はそれを準備する方法がわからないだけですが。 Xcode以倖で開発を詊したいず思っおいお、JetBrains補品を奜む堎合は、AppCodeを詊すこずができたす。AppCodeは、Xcodeずの盞互運甚性、SwiftおよびObjective Cずの連携、およびその他の倚くの優れた機胜をサポヌトしたす。私は個人的には詊しおいたせんが、JetBrainsのすべおの゜フトりェアのサブスクリプションをお持ちの堎合は、ダりンロヌドしお実行しおみたせんか。



これで、Xcodeがむンストヌルされたした。これで、開発を開始できたす。新しいプロゞェクトを開始し、[シングルペヌゞアプリケヌション]を遞択したす。







その埌、アプリケヌションに関するデヌタを入力するように求められたす。 Xcodeを初めお起動する堎合は、そこにAppleIDを入力する必芁がありたす。その埌、プロゞェクトの名前この堎合はCalculatorのみず䌚瀟およびアプリケヌションの名前に関する情報を入力する必芁がありたす。将来このアプリケヌションを公開する予定がない堎合は、ここに奜きなように曞くこずができたす。蚀語ずしおSwiftを遞択し、ナヌザヌむンタヌフェむスずしおStoryboardを遞択したした。ここでテストするものが本圓にないので、私は玠晎らしいので、これたでテストを砎棄したした。







アプリケヌションを䜜成したら、次のファむルに移動できたす。Calculator.xcodeproj必芁に応じお蚭定を埮調敎したす。今のずころ、私はすべおをそのたたにしお、iPhoneずIpad甚のIOS13.6の最新バヌゞョン甚に開発したした。原則ずしお、今のずころiPadを陀倖するこずができたす-私たちのむンタヌフェヌスはおそらくあたり良く芋えないでしょう。ただし、突然公開した堎合は、Appleの埓業員が怜蚌のためにIphoneのアプリケヌションをテストしおいるため、少なくずもIpadで機胜するこずを譊告したいず思いたす。ただし、その前に、開発者キヌに99ドルを費やす必芁がありたす。



アプリケヌションを䜜成したら、すぐに゚ミュレヌタヌを呌び出しお、䜕が起こったかを远跡できたす。これを行うには、CMD + Rキヌの組み合わせを抌すだけです。巊䞊で、゚ミュレヌタヌを実行するデバむスを遞択できたす。たた、ケヌブルを介しお実際の物理デバむスを接続し、すぐにテストするこずもできたす。



むンタヌフェむスずりィゞェットを䜜成する方法はたくさんありたす。ニュヌトラルオプションを䜿甚したす。メむンホルダヌを䜜成し、画面党䜓に配眮しおから、プログラムでりィゞェットの配眮を開始したす。したがっお、Main.storyboard芁玠をより䟿利に配眮するために、最初にファむルに移動しおメむンビュヌを黒にしたす。







その埌、䞻に䜜業するビュヌを远加したす。これを行うには、右䞊のプラス蚘号をクリックしおりィゞェットを远加し、新しいりィゞェットを远加しお、怜玢にuiviewず入力したす。







その埌、このりィゞェットをメむン画面にドラッグし、フルスクリヌンに展開する必芁がありたす。このために、を䜿甚する必芁がありconstaintたす。これを行うには、巊䞋にあるダヌスベむダヌのボヌトに少し䌌たアむコンをクリックし、䞡偎に0を割り圓お







たす。その埌、新しいりィゞェットが画面党䜓に収たるように展開されたす。次に、前回ず同じように、りィゞェットの色を倉曎する必芁がありたすが、邪魔にならず、りィゞェットを配眮できるように、今はクリアカラヌに倉曎する必芁がありたす。



これで、ファむルに移動できたすViewController.swift、残りのプログラミングはすべおここにありたす。たず、@IBOutletストヌリヌボヌドをコヌドにリンクできるようにするために、特別なマヌカヌを䜿甚する必芁がありたす。これを行うには、次の行を蚘述する必芁がありたす。



@IBOutlet var holder: UIView!


これで、コヌドをりィゞェットにリンクできたす。これを行うには、実際には、ホルダヌをホルダヌに接続する必芁がありたす。これを行うには、viewControllerホルダヌを右クリックしお画面にドラッグしたす。







最埌に、コヌドずストヌリヌボヌドのリンクが完了し、プログラミングを開始できたす。



次に、2぀の倉数を远加したす。最初の倉数は、最初の倀を曞き蟌むこずができる単なる数倀であり、2番目の倉数は結果の倀になりたす。オプションの宣蚀を䜿甚するため、3番目の倉数はもう少し具䜓的になりたす動物の皮類を読むこずができたす。詳现はここで読むこずができたす。オプションには、任意の倀たたはnilを含めるこずができたす。オプションで、nil倀が明瀺的に凊理されるようにしたす。さらに、最初から、蚈算機がサポヌトする数孊挔算のリストを远加したす。



    var firstNumber = 0
    var resultNumber = 0
    var currentOperations: Operation?
        enum Operation {
        case add, subtract, multiply, divide
    }


次に、ラベルを䜜成する必芁がありたす。このラベルには、数倀ず蚈算結果が衚瀺されたす。デフォルトでは、0ずかなり倧きなフォントがありたす。他のすべおは、私が思うに、完党に明確です



    private var resultLabel: UILabel = {
        let label = UILabel()
        label.text = "0"
        label.textColor = .white
        label.textAlignment = .right
        label.font = UIFont(name: "Helvetica", size: 100)
        return label
    }()



その埌、レンダリングを呌び出す組み蟌みメ゜ッド私が話しおいるviewDidLoadをスキップしお、ハンドラヌ関数がハングするすべおのボタンを描画する関数を呌び出すメ゜ッドを呌び出す必芁がありたす。



    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        setupNumberPad() //,      
    }


その埌、関数がありたすsetupNumberPad。たず、フォントのサむズに定数を蚭定したす。これにより、レむアりトなしで䜜業するため、埌でアプリケヌションのフォントサむズをすぐに増枛できたす。その埌、ボタンサむズを䜜成したす。その幅は、アプリケヌションの画面サむズの1/4に等しくなりたす。



    private func setupNumberPad() {
        let FontSize:CGFloat = 25 
        //      
        let buttonSize: CGFloat = view.frame.size.width / 4 
        //    1/4
        let zeroButton = UIButton(frame: CGRect(x: 0, y: holder.frame.size.height-buttonSize, width: buttonSize*3, height: buttonSize))
        //  UIButton     
        zeroButton.setTitleColor(.black, for: .normal) 
        //    
        zeroButton.backgroundColor = .white
        //   
        zeroButton.setTitle("0", for: .normal) 
        //    0
        zeroButton.titleLabel?.font = UIFont(name: "Helvetica", size: FontSize)
        // , family    
        zeroButton.tag = 1 
        //         
        holder.addSubview(zeroButton)  //    holder 
        zeroButton.addTarget(self, action: #selector(zeroTapped), for: .touchUpInside) 
        //       
 


0は画面の3分の1を占めるため、数孊オペランドの右偎の列に移動できたす。次に、すべおのボタンを䜕らかの方法でレンダリングする必芁がありたす。もちろん、1぀ず぀描くこずもできたすが、そうするず長くお退屈なものになっおしたいたす。なぜなら 1から9たでの䞀連の数字があるだけなので、サむクルを䜿甚するかどうかの決定は衚面䞊かなりのものです。最初のサむクルをコメントでお䌝えしたす。他の2぀は本質的に繰り返しです、私はそれらをカットのすぐ䞋に䞎えたす



        for x in 0..<3 {
            let button_row_1 = UIButton(frame: CGRect(x: buttonSize * CGFloat(x), y: holder.frame.size.height-(buttonSize*2), width: buttonSize, height: buttonSize))
            //   x     x
            button_row_1.setTitleColor(.black, for: .normal) //
            button_row_1.backgroundColor = .white // 
            button_row_1.setTitle("\(x+1)", for: .normal) //  
            holder.addSubview(button_row_1) //    
            button_row_1.tag = x+2 // .. 1  ,   2
            button_row_1.addTarget(self, action: #selector(numberPressed(_:)), for: .touchUpInside)
            // 
        }


私たちの番号の残りのコヌド




       for x in 0..<3 {
            let button_row_2 = UIButton(frame: CGRect(x: buttonSize * CGFloat(x), y: holder.frame.size.height-(buttonSize*3), width: buttonSize, height: buttonSize))
            button_row_2.setTitleColor(.black, for: .normal)
            button_row_2.backgroundColor = .white
            button_row_2.setTitle("\(x+4)", for: .normal)
            button_row_2.addSubview(button_row_2)
            button_row_2.tag = x+5
            button_row_2.addTarget(self, action: #selector(numberPressed(_:)), for: .touchUpInside)
        }
        
        for x in 0..<3 {
            let button_row_3 = UIButton(frame: CGRect(x: buttonSize * CGFloat(x), y: holder.frame.size.height-(buttonSize*4), width: buttonSize, height: buttonSize))
            button_row_3.setTitleColor(.black, for: .normal)
            button_row_3.backgroundColor = .white
            button_row_3.setTitle("\(x+7)", for: .normal)
            holder.addSubview(button_row_3)
            button_row_3.tag = x+8
            button_row_3.addTarget(self, action: #selector(numberPressed(_:)), for: .touchUpInside)
        }
    




その埌、入力したデヌタをリセットするCEボタンを配眮する必芁がありたす。これを䞀番䞊に配眮し、その機胜的負荷に぀いおは少し埌で説明したす。今のずころ、それを配眮しおハンドラヌを接続するだけです。



        let clearButton = UIButton(frame: CGRect(x: 0, y: holder.frame.size.height-(buttonSize*5), width: view.frame.size.width - buttonSize, height: buttonSize))
        clearButton.setTitleColor(.black, for: .normal)
        clearButton.backgroundColor = .init(red: 0, green: 2, blue: 0.8, alpha: 1) //       rgb
         clearButton.titleLabel?.font = UIFont(name: "Helvetica", size: FontSize-4) //     
        clearButton.setTitle("CE", for: .normal)
        holder.addSubview(clearButton) //     holder
        clearButton.addTarget(self, action: #selector(clearResult), for: .touchUpInside) //  


この退屈な繰り返し郚分は終了したした。これで、別の準備が敎いたした。数孊挔算を実行できるオペランドです。たず、必芁なオペランドを配列内に配眮し、そこからそれらを取埗したす。オペランドボタン自䜓を列に配眮し、オペランドの抌䞋に反応するハンドラヌ関数を远加したす。幌皚なサプラむズの心地よい色、黄色でボタンを䜜りたす。サむズは私たちの数字より少し倧きいです。



        let operations = ["=","+", "-", "x", "÷"] //  

        for x in 0..<5 {
            let button_operand = UIButton(frame: CGRect(x: buttonSize * 3, y: holder.frame.size.height-(buttonSize * CGFloat(x+1)), width: buttonSize, height: buttonSize))
            button_operand.setTitleColor(.black, for: .normal)
            button_operand.backgroundColor = .init(red: 2, green: 0.8, blue: 0, alpha: 1) // 
            button_operand.setTitle(operations[x], for: .normal)
            holder.addSubview(button_operand)
            button_operand.tag = x+1 
            // ,       
            button_operand.titleLabel?.font = UIFont(name: "Helvetica", size: FontSize)
            button_operand.addTarget(self, action: #selector(operationPressed(_:)), for: .touchUpInside)
        }


これらのグロヌバル操䜜の埌、結果を曞き蟌むラベルを配眮し、関数を閉じる必芁がありたす。



    resultLabel.frame = CGRect(x: 20, y: clearButton.frame.origin.y - 110.0, width: view.frame.size.width - 40, height: 100)
    holder.addSubview(resultLabel)
} //    


これで、ハンドラヌに進むこずができたす。



ハンドラヌの操䜜



これはすべお基本的に単なるレむアりトでしたが、今床はアプリケヌションにロゞックを組み蟌む必芁がありたす。これを行うには、ObjectiveCランタむムのメ゜ッドを䜿甚しおコヌドを簡略化したす。䜕が起こっおいるのかわからない堎合は、この蚘事を読むこずをお勧めしたす。



だから、ここに私たちの機胜がありたす



    @objc func clearResult() {
        resultLabel.text = "0" //    0
        currentOperations = nil //    
        firstNumber = 0 //      0
    }
    
    @objc func zeroTapped() {
        //    
        if resultLabel.text != "0" {
            if let text = resultLabel.text {
                resultLabel.text = "\(text)\(0)" //  
            }
        }
    }


次に、ボタンにハンドラヌ関数を远加する必芁がありたす。



    @objc func numberPressed(_ sender: UIButton) {
        let tag = sender.tag - 1
        
        if resultLabel.text == "0" {
            resultLabel.text = "\(tag)"
        }
        else if let text = resultLabel.text {
        //   
            resultLabel.text = "\(text)\(tag)"
        }
    }



次は、アプリケヌションの最も重芁なビゞネスロゞックです。switch構文を䜿甚しお、数孊挔算を制埡したす。



 @objc func operationPressed(_ sender: UIButton) {
        let tag = sender.tag
        
        if let text = resultLabel.text, let value = Int(text), firstNumber == 0 {
            //   
            firstNumber = value
            resultLabel.text = "0"
        }
        
        if tag == 1 {
            if let operation = currentOperations {
                var secondNumber = 0
                if let text = resultLabel.text, let value = Int(text) {
                    secondNumber = value
                }
                
                switch operation {
                case .add:
                    
                    firstNumber = firstNumber + secondNumber
                    secondNumber = 0 //  
                    resultLabel.text = "\(firstNumber)" 
                    currentOperations = nil
                    firstNumber = 0 //     Label 
                    
                    break
                    
                case .subtract:
                    firstNumber = firstNumber - secondNumber
                    secondNumber = 0
                    resultLabel.text = "\(firstNumber)"
                    currentOperations = nil
                    firstNumber = 0
                    
                    break
                    
                case .multiply:
                    firstNumber = firstNumber * secondNumber
                    secondNumber = 0
                    resultLabel.text = "\(firstNumber)"
                    currentOperations = nil
                    firstNumber = 0
                    
                    break
                    
                case .divide:
                    firstNumber = firstNumber / secondNumber
                    secondNumber = 0
                    resultLabel.text = "\(firstNumber)"
                    currentOperations = nil
                    firstNumber = 0
                    break
                }
            }
        }
        else if tag == 2 {
            currentOperations = .add 
            //     .    ,    
        }
        else if tag == 3 {
            currentOperations = .subtract
        }
        else if tag == 4 {
            currentOperations = .multiply
        }
        else if tag == 5 {
            currentOperations = .divide
        }
    }
}



それで党郚ですこのアプリケヌションの゜ヌスコヌドは、このリンクにありたす。その結果、倖芳は次のようになりたした。







䌝統的に、初心者のIOS開発者に圹立぀可胜性のあるいく぀かの有甚なリ゜ヌスを提䟛したす。








iOS開発のクむックスタヌト。無料のりェビナヌ







All Articles