用阵列中的手电筒执行莫尔斯电码

野蛮的

我有一个字符数组“。” 和“-”是莫尔斯电码的翻译文本。由于摩尔斯电码,它们当然按特定顺序排列。现在我想在点击按钮后将此数组转换为 iPhone 中手电筒的长短闪光。我当然尝试使用 'if' 语句循环遍历这个数组,使用如下所示的 scheduleTimers,但显然这不起作用,循环立即执行,手电筒仅启动一次。

let dash: Character = "-"
let dot: Character = "."

for i in translatedArray {
  if i == dash{

    //two sec delay at the beggining because of the pause beetween each flash which is equal to one dot
    timer1 = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(toggleFlashlightOn), userInfo: nil, repeats: false)
    timer2 = Timer.scheduledTimer(timeInterval: 6, target: self, selector: #selector(toggleFlashlightOff), userInfo: nil, repeats: false)
    print("long flash activated")
  }else if i == dot{
    timer1 = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(toggleFlashlightOn), userInfo: nil, repeats: false)
    timer2 = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(toggleFlashlightOff), userInfo: nil, repeats: false)
    print("short flash activated")
  } else { return }
}

我还尝试使用 delay() 函数延迟单独的“if”迭代,但是使用莫尔斯电码执行此循环应该在每次迭代之间有不规则的时间间隔,具体取决于前一个字符,也就是之前的 flash 长度,并且 delay() 只有静态值秒,所以这也不起作用。

最后我在这里找到了这个线程。除了将其更新为 swift4,并将莫尔斯电码字符数组更改为时间间隔数组,我成功地做到了这将是我问题的完美解决方案......但它不起作用。它仅在一种模式下打开手电筒,并以数组中的第一个时间间隔值定期刷新不断地打印“ON”,例如每 2 秒左右。所以它永远不会关闭手电筒。

let shortFlash: Double = 2
let longFlash: Double = 4
let pause: Double = 2

var sequenceOfFlashes: [Double] = []

//this works ok, prints correct values in correct order from sequenceOfFlashes array

func setupMorseFlashesSequence(){  
    let dot: Character = "•"
    let line: Character = "—"

    for i in translatedArray { 
        switch i {
        case dot:
            sequenceOfFlashes.append(shortFlash)
            sequenceOfFlashes.append(pause)
        case line:
            sequenceOfFlashes.append(longFlash)
            sequenceOfFlashes.append(pause)
        default:
            return
        }
    }
    print(sequenceOfFlashes)
}

var index: Int = 0

weak var timer: Timer?

func scheduleTimer(){
    timer = Timer.scheduledTimer(timeInterval: sequenceOfFlashes[index], target: self, selector: #selector(timerTick), userInfo: nil, repeats: false)
}

 @objc func timerTick(){
    if index == sequenceOfFlashes.count {
        stop()
    }
    turnFlashlight(on: index % 2 == 0)
    scheduleTimer()
}

func start(){
    index = 0
    turnFlashlight(on: true)
    scheduleTimer()
}

func stop(){
    timer?.invalidate()
    turnFlashlight(on: false)
}

deinit{
    timer?.invalidate()
}

我怎样才能实现不同时间一一执行这个闪烁?

瓦瓦马

你忘了递增indextimerTick()

@objc func timerTick(){
    index += 1
    if index == sequenceOfFlashes.count {
        stop()
    }
    turnFlashlight(on: index % 2 == 0)
    scheduleTimer()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章