Saya memiliki dua UIButtons pada pandangan saya, satu untuk radio FM dan satu untuk radio AM. Ketika tombol FM ditekan, saya ingin menampilkan nilai FM untuk nama stasiun, frekuensi, dan nilai bandwidth di masing-masing label, dan juga untuk AM.

Saya memiliki kode yang berfungsi menggunakan metode buttonClick terpisah untuk setiap tombol tetapi karena kodenya identik, saya ingin mencoba melakukan semuanya di dalam satu metode. Kekejian ini ada di bawah!

Berikut adalah kode sekarang untuk metode tekan tombol.

    @IBAction func buttonClick(_ sender: Any) {
        if buttonFM != nil {
            if myStation.isBandFM() == 1 {
            stationBand.text = "FM1"
            stationName.text = myStation.name //set top left label text to name property of myStation object
                stationFrequency.text = "\(myStation.frequency)"
            }
        } else if buttonAM != nil {
            if myStation.isBandFM() == 0 {
            stationBand.text = "AM1" //final exercise, part 1.
            stationName.text = myStationAM.name
            stationFrequency.text = "\(myStationAM.frequency)"
        }
    }
}

Ini adalah seluruh kode pengontrol tampilan:

    class ViewController: UIViewController {

        @IBOutlet weak var stationName: UILabel!
        @IBOutlet weak var stationFrequency: UILabel!
        @IBOutlet weak var stationBand: UILabel!

        @IBOutlet weak var buttonFM: UIButton!
        @IBOutlet weak var buttonAM: UIButton!

        var myStation: RadioStation //FM station

        var myStationAM: RadioStation //AM station

        required init?(coder aDecoder: NSCoder) {
            myStation = RadioStation()  
            myStationAM = RadioStation()
            myStation.frequency = 104.7
            myStationAM.frequency = 800.2
            myStation.name = "FM1"
            myStationAM.name = "AM1"
            super.init(coder: aDecoder)
        }

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

        @IBAction func buttonClick(_ sender: Any) {
        if buttonFM != nil {
            if myStation.isBandFM() == 1 {
            stationBand.text = "FM1"
            stationName.text = myStation.name //set top left label text to name property of myStation object
                stationFrequency.text = "\(myStation.frequency)"
            }
        } else if buttonAM != nil {
            if myStation.isBandFM() == 0 {
            stationBand.text = "AM1" //final exercise, part 1.
            stationName.text = myStationAM.name
            stationFrequency.text = "\(myStationAM.frequency)"
        }
    }
}

Dan ini adalah metode kelas:

class RadioStation: NSObject {

    var name: String
    var frequency: Double

    override init() {  //init class method to set default values.
        name = "Default"
        frequency = 100
    }

    static var minAMFFrequency: Double = 520.0
    static var maxAMFFrequency: Double = 1610.0
    static var minFMFFrequency: Double = 88.3
    static var maxFMFFrequency: Double = 107.9

    func isBandFM() -> Int {
        if frequency >= RadioStation.minFMFFrequency && frequency <= RadioStation.maxFMFFrequency {
            return 1 //FM
        } else  {
            return 0 //AM
        }

} 
-1
timman 28 Maret 2020, 16:22

1 menjawab

Jawaban Terbaik

Saya kira Anda tidak dapat menghentikan orang menulis kode yang buruk. Alasan mengapa ini adalah kode yang buruk karena rusak [S][O]LID — Pemisahan masalah dan juga Buka/Tutup. Sekarang tindakan tombol menangani lebih dari satu masalah.

Bagaimanapun, ubah jenis pengirim Anda dari any ke UIButton, lalu periksa judul label.


    @IBAction func buttonClick(_ sender: UIButton) {
        guard let button = sender.titleLabel?.text else {return}
        if button == buttonFM.title {
            if myStation.isBandFM() == 1 {
            stationBand.text = "FM1"
            stationName.text = myStation.name //set top left label text to name property of myStation object
                stationFrequency.text = "\(myStation.frequency)"
            }
        } else if button == buttonAM.title {
            if myStation.isBandFM() == 0 {
            stationBand.text = "AM1" //final exercise, part 1.
            stationName.text = myStationAM.name
            stationFrequency.text = "\(myStationAM.frequency)"
        }
    }
}

Anda harus memikirkannya seperti ini. Jika Anda ingin mengubah fungsionalitas salah satu tombol di masa mendatang, sekarang Anda harus mengedit tindakan buttonClick dalam dua keadaan terpisah.

Jika Anda benar-benar ingin melakukan ini seperti ini, saya sarankan melakukan beberapa abstraksi setidaknya dan membuat dua fungsi seperti itu ...

// Using some abstraction if you decide to make modification
// based on an action you wont need to touch this method anymore. 
// The changes would be made in their corresponding functions. 

    @IBAction func buttonClick(_ sender: UIButton) {

        guard let button = sender.titleLabel?.text else {return}

        if button == buttonFM.title {
               buttonFMClick()
            }
        } else if button == buttonAM.title {
               buttonAMClick()
        }
    }
}
0
Michael Wells 28 Maret 2020, 16:36