You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:10:47