Swift新手求助:如何简化人物识别按钮点击函数
简化Swift按钮点击函数的几种方法
嘿,作为Swift新手能想到复用代码来帮儿子做识别人物的APP,这思路超棒!你的核心需求是去掉重复的else if判断,统一处理匹配到人物姓名后的逻辑,我给你几个简单易懂的方案:
方案1:把元组转成数组,统一判断处理
你现在用的元组虽然能通过.a/.b调用,但不方便批量检查。我们可以先把元组里的名字转成一个数组,然后用数组的contains方法快速判断按钮标题是否在列表中,之后统一执行逻辑:
var appearingInPhoto = (a:"omar", b:"john", c:"thomas") // 把元组的元素转成数组,方便后续批量判断 private let photoNames = [appearingInPhoto.a, appearingInPhoto.b, appearingInPhoto.c] @IBAction func buttonPressed(_ sender: UIButton) { // 先安全获取按钮标题,并且检查是否在我们的人物列表里 guard let selectedName = sender.currentTitle, photoNames.contains(selectedName) else { return // 如果标题无效或者不在列表中,直接退出函数 } // 所有匹配到的情况都用同一套逻辑处理 print("pressed \(selectedName)") label.text = selectedName playSoundFile(selectedName) }
为什么这样更好?
- 去掉了重复的
if/else if代码,逻辑更清晰 - 以后要新增人物时,只需要在元组里加一个元素,同时更新
photoNames数组,不用修改按钮点击函数的核心逻辑
方案2:直接用数组存储人物姓名(更推荐)
既然你不需要用.a/.b这种方式调用,其实可以直接把人物姓名存在数组里,省去元组转数组的步骤:
// 直接用数组存储所有人物姓名 private let appearingInPhoto = ["omar", "john", "thomas"] @IBAction func buttonPressed(_ sender: UIButton) { guard let selectedName = sender.currentTitle, appearingInPhoto.contains(selectedName) else { return } print("pressed \(selectedName)") label.text = selectedName playSoundFile(selectedName) }
这个方案更简洁,后续维护起来也更方便——新增人物只要往数组里加字符串就行。
额外小提示
如果能确保所有按钮的标题一定是appearingInPhoto里的内容(不会出现其他无效标题),那可以去掉contains检查,直接unwrap标题后执行逻辑,但保留检查能让代码更健壮,避免意外崩溃。
内容的提问来源于stack exchange,提问作者mikeT
相关产品推荐
相关产品推荐

