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

如何从指定范围数组中取值?及TV类相关实现优化问题咨询

问题解答

1. 从指定范围中获取数字

在Swift中,针对指定范围(如0...100闭区间)获取数字,常见操作方式如下:

  • 生成随机数:直接调用Int.random(in:)方法从目标范围生成随机整数
    let randomNum = Int.random(in: 0...100)
    print(randomNum)
    
  • 转数组后获取元素:先将范围转换为数组,再通过下标、遍历等方式获取元素
    let numberRange = 0...100
    let numberArray = Array(numberRange)
    // 获取第一个元素
    let firstNum = numberArray[0]
    // 获取最后一个元素
    let lastNum = numberArray.last!
    // 遍历输出所有元素
    for num in numberArray {
        print(num)
    }
    

2. 电视音量功能实现与tvName字段整合

实现音量功能并打印当前等级

现有代码中Setting的volume定义存在问题,直接赋值(0...100)会让它成为闭区间类型,而非具体的音量数值。以下是修正后的实现方案:

struct Setting {
    // 用属性观察者限制音量在0-100区间内
    private(set) var volume: Int = 0 {
        willSet {
            volume = max(0, min(newValue, 100))
        }
    }
    enum Display: String {
         case colorful = "Color"
         case blackwhite = "Black&White"
    }
    // 提供外部调整音量的方法
    mutating func setVolume(to value: Int) {
        volume = max(0, min(value, 100))
    }
}

class Tv {
    var tvName = (firm: "", model: 0)
    var isActive = false
    // 关联电视的设置实例
    var settings = Setting()
    enum Channels: String {
        case news = "News"
        case serials = "Serials"
        case horror = "Horror"
        case comedy = "Comedy"
        case history = "History"
        case cartoons = "Cartoons"
    }
    func tvStatus() {
        if isActive {
            // 打印当前音量等级
            print("The TV \(tvName.firm) \(tvName.model) is on and shows the channel \(Channels.serials.rawValue), display: \(Setting.Display.colorful.rawValue), volume: \(settings.volume)")
        } else {
            print("TV is off")
        }
    }
}

// 使用示例
let oldTv = Tv()
oldTv.tvName.firm = "LG"
oldTv.tvName.model = 6643
// 设置音量为50
oldTv.settings.setVolume(to: 50)
oldTv.isActive = true
oldTv.tvStatus()

整合电视品牌与型号到tvName字段

有两种简洁的实现方式:

  1. 添加计算属性:保留原有元组字段,新增计算属性返回整合后的名称
class Tv {
    var tvName = (firm: "", model: 0)
    // 计算属性自动拼接品牌与型号
    var fullTvName: String {
        "\(tvName.firm) \(tvName.model)"
    }
    // 其他代码不变...
}

调用时直接使用oldTv.fullTvName即可获取整合后的名称。

  1. 直接使用字符串属性+同步更新:将tvName改为字符串类型,通过单独的品牌、型号属性同步更新它
class Tv {
    var tvName: String = ""
    private var firm: String = "" {
        didSet { updateTvName() }
    }
    private var model: Int = 0 {
        didSet { updateTvName() }
    }
    private func updateTvName() {
        tvName = "\(firm) \(model)"
    }
    // 对外暴露设置品牌和型号的方法
    func setFirm(_ newFirm: String) {
        firm = newFirm
    }
    func setModel(_ newModel: Int) {
        model = newModel
    }
    // 其他代码不变...
}

使用示例:

oldTv.setFirm("LG")
oldTv.setModel(6643)
print(oldTv.tvName) // 输出 "LG 6643"

内容的提问来源于stack exchange,提问作者Alluroso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:10:46