iOS开发2——分解质因数小程序

本文全部原创,转载请务必注明出处。

在上一篇里,我们已经简单介绍了iOS开发的基础,如果没有理解,也没关系,今天我会带着大家一起制作一个小程序。

目标:

  • 学习如何用Storyboard布局
  • 学习如何将代码和控件联系在一起
  • 开发出一个分解质因数的简单iOS应用

那我们就开始吧!

在昨天新建的项目里,打开Main.storyboard。

在界面上,可以看到iPhone 11 Pro Max的手机屏幕——一个ViewController。

(当然,你也可以自定义机型,比如iPad Pro。这些操作大家自行研究,这里就不做介绍了。)

我们需要什么控件

要制作一个分解质因数的应用,我们当然需要——一个标签用来显示结果,一个输入框用来输入数字,以及一个按钮,用户点击它,程序就会计算结果。

不用着急,这些按钮(Button),输入框(Text Field),标签(Label)等控件,早就在系统里定义好了。点击工具栏靠右上角的“+”,拖入控件,并排版:

在Storyboard里的Text Field,在系统UIKit里叫做“UITextField”类,用于输入单行文本。

在Storyboard里的Button,在系统UIKit叫做“UIButton”,在按下按钮式,将会触发一些时间。

在Storyboard中的标签,叫做"UILabel",用于显示只读文本。

将控件连接到代码

要想在控制ViewController视图里的内容,我们必须使用代码。

点击目前Main.storyboard文件的右上角这个按钮,你就会发现Xcode进入了分屏浏览模式。点击新增的这个窗口,在左边的文件管理器中选择“ViewController.swift”。

这样,Xcode的左边会显示Main.storyboard,右边会显示ViewController.swift。

重要的操作开始了!

  • 单击那个文本框。
  • 按住Control键。
  • 按住文本框。
  • 把鼠标拖动到代码override func viewDidLoad()这行代码上面。
  • 松开鼠标。
  • 会出现一个弹窗。
  • 按下图填写。
  • Connect。
  • 同样操作Label。
  • 在Name里填写“AnswerLabel”。
  • Connect。

ViewController代码会变成:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var NumberTextField: UITextField!
    // @IBOutlet代表这个Text Field是从Storyboard界面设计器里面连接过来的。
    // 这就代表了在ViewController这个类里面定义了一个UITextField类型的变量NumberTextField。

    @IBOutlet weak var AnswerLabel: UILabel!
    // 一样的道理

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

这样,两个控件已经连接到代码了。

连接Button到代码

连接Button到代码可不一样,因为其他两个控件都不用触发事件,而这个Button会触发事件(当Button被点击,执行事件)。

  • 同样,单击Button。
  • 按住Control。
  • 拖动到代码。
  • 松开,弹窗出现。
  • 弹窗的内容按下图处理。
  • 点击connect。

这时,ViewController代码:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var NumberTextField: UITextField!
    @IBOutlet weak var AnswerLabel: UILabel!
    
    // 当点击Button,将会触发这个函数,这个函数里面的内容将被执行。
    // 参数sender就是触发这个函数的按钮。
    // @IBAction代表这是从Storyboard连接到代码的事件。
    @IBAction func ButtonClicked(_ sender: UIButton) {

    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

好了,一切控件连接完毕,开始敲代码。

分解质因数算法

  • 得到一个数N。
  • 新建一个字符串S。
  • 从2开始。求N除以2的余数。
  • 如果余数是0,那么N就有2这个因数。S加上"2×",N除以2。
  • 如果不是0,继续试3。

当然,如果N被除到了1,说明分解完毕,直接输出,不用继续试。

话不多说,上代码:

    func fenjie(number: Int) -> String { // 这个函数返回一个String字符串类型的值
        var N = number, p = 2
        var S = "" // 新建字符串变量S
        while N >= 1 {
            if N % p == 0 { // 如果余数是0
                N /= p; // N除以p
                S += String(p)
                S += "×" // S 加上 p×
            } else {
                p += 1 //继续试下一个数
            }
        }
        S.removeLast() // 因为会多出来一个"×",所以删掉最后一个字符
        return S // 返回S
    }

将这段代码拷贝至 class ViewController: UIViewController { 这行代码下方。

接下来...

我们需要在按按钮以后计算。所以需要在ButtonClicked(_:)这个函数里面写代码。

  • 第一步:把文本框里的文本转换为数字
  • 第二步:计算出分解质因数的结果
  • 第三部:把标签的文本转换为结果
// 第一步:
let num = Int(NumberTextField.text ?? "1") ?? 1
// 实际上,这段代码应该是let num = Int(NumberTextField.text)
// 但是,由于NumberTextField文本框的文本很可能为空,这样就会引起程序报错。
// 所以,要提供一个默认值(?? "1")
// 同样的,转换成Int整数类型以后,也可能转换不成功,所以也需要提供一个默认值1。
// 第二步:
let result = fenjie(number: num)
// 获取分解质因数的结果,存储在result字符串里。
// 第三步:
AnswerLabel.text = result
// 将AnswerLabel的文本切换为result。

完整的ButtonClicked(_:)代码如下:

    @IBAction func ButtonClicked(_ sender: UIButton) {
        let num = Int(NumberTextField.text ?? "1") ?? 1
        let result = fenjie(number: num)
        AnswerLabel.text = result
    }

OK,大功告成。点击运行。或启动iOS模拟机,模拟机的机型为你选择的机型(默认 iPhone 11 Pro Max)。

完成!在iOS虚拟机中输入数,分解。

当然,这是只iOS开发中最最最最最简单的一个小应用。但是,很有成就感,不是吗?

你也可以在这个程序的基础上进行改动,变成其他的应用,比如计算最大公约数、最小公倍数等。

最后,附上完整源代码:

// ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    func fenjie(number: Int) -> String {
        var N = number, p = 2
        var S = ""
        while N > 1 {
            if N % p == 0 {
                N /= p
                S += String(p)
                S += "×"
            } else {
               p += 1
            }
        }
        S.removeLast()
        return S
    }

    @IBOutlet weak var NumberTextField: UITextField!
    @IBOutlet weak var AnswerLabel: UILabel!
    
    @IBAction func ButtonClicked(_ sender: UIButton) {
        let num = Int(NumberTextField.text ?? "1") ?? 1
        let result = fenjie(number: num)
        AnswerLabel.text = result
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
    }

}

== The End ==

0 0 vote
Article Rating
Subscribe
提醒
2 评论
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Zhang, Xuheng

你这个代码太复杂

2
0
Would love your thoughts, please comment.x
()
x