Ios Swift应用程序架构

Ios Swift应用程序架构,ios,swift,Ios,Swift,我正在构建一个应用程序的音频游览组件,我在组织和调用数据方面遇到了一个常规。我对iOS开发完全没有兴趣;来自Ruby/Rails背景 类名称以粗体显示:目标是在每次巡演停止时触发特定信息。每个停止,都将是一个音频剪辑并播放一段声音片段,或者它启动一个轨迹,引导用户进入下一个停止,或者它将闪烁一个带有视频的视频模式,等等。在每次停止时,到达后都需要回调。例如,如果我到了艺术博物馆,我会听到一段关于蒙娜丽莎的剪辑,然后手机上会显示一幅画像的图像。但是,并非所有站点都是平等创建的,因此,即使art m

我正在构建一个应用程序的音频游览组件,我在组织和调用数据方面遇到了一个常规。我对iOS开发完全没有兴趣;来自Ruby/Rails背景

类名称以粗体显示:目标是在每次巡演停止时触发特定信息。每个停止,都将是一个音频剪辑并播放一段声音片段,或者它启动一个轨迹,引导用户进入下一个停止,或者它将闪烁一个带有视频的视频模式,等等。在每次停止时,到达后都需要回调。例如,如果我到了艺术博物馆,我会听到一段关于蒙娜丽莎的剪辑,然后手机上会显示一幅画像的图像。但是,并非所有站点都是平等创建的,因此,即使art meseum站点有音频文件和图像可供播放,但公园的站点可能只显示一条步行小道,而没有其他内容

我的应用程序设置如下:

class Stop: NSObject {
  func execStop() {
    // do stuff
  }
}
class AudioClip: Stop { }
class Trail: Stop { }
class StopImage: Stop { }
所有这些巡更都需要按相应顺序触发,如果未到达当前站点,则不应显示下一个巡更站点。我能想出的最好办法是这样:

// Each stop defined as its own class
class Museum: AudioClip {
  override func execStop() {
    playAudio(name: "AudioFile.m4a")
    showImage(name: "MonaLisa.jpg")
  }
}
class Park: Trail { 
  override func execStop() {
    addRoute([Array, of, coordinates])
  }
}

class Tour: NSObject {
  var stops: [Int: AnyObject] = [:]

  func resume() -> Void {
       let active = nextAvailableStopLookup()
       let currentStop = self.stops[(active as Int)] as! Stop
       return currentStop.execStop()
  }

}

// Individual tours, i.e. Museum, Resturant, Hike
class MuseumTour: Tour {
  var TourPoints = [
    1: Museum(...)
    2: Park(...)
  ]
}
然后在
ViewController
中,当前巡更将被激活,并根据最后一站完成情况,下一站将排队

override func viewDidLoad() {
  let queueStop: Void = MuseumTour().resume()
}
问题

这似乎是一种设置应用程序的可怕方式,需要大量的开销。每个站点都是一个新的类,可能有60个站点以上,即60个单独的类。回调是kicker-继承的类函数(如
AudioClip
上的
func playAudio
)在
MuseumTour
类中不可用。我是个新手,我不知道如何触发动态闭包


有没有更好的方法来组织和调用这种类型的数据?

在任何语言中,您所做的肯定都是非常愚蠢的

据我所知,在某种程度上,我能够通过你的描述保持清醒,“停止”只是一系列要做的事情(以及指向另一个“停止”的指针?我不能完全从你的描述中分辨出来)。所以在我看来,Stop是Stop类的一个实例(或者,在Swift中,更可能是一个struct),这就是它的全部;不需要所有这些课程

您的“我不知道如何准确地触发动态闭包”非常有说服力,因为在我看来,函数数组正是您希望“停止”的内容。也许你的第一步应该是“停下来”(抱歉)并学习Swift,在这里函数是一流的公民,所以它们的数组是完全正常的

在我非常恼人的应用程序“99瓶”中,它唱着“99瓶啤酒在墙上”,在歌曲的每一行,我们都会执行一个或多个动作,比如取下一瓶,或者从屏幕上取下瓶子,我们必须知道唱哪一行歌曲。因此,在我的应用程序中,短语结构由要唱的内容和要执行的操作列表组成:

struct Phrase {
    let sound : String // name of sound file
    let actions : [() -> ()] // what else to do
}
因此,这首歌作为一个整体只不过是一系列短语实例。我们从数组中弹出第一个短语,唱
声音
,然后按顺序调用
操作
函数:

let instruction = self.stages.removeAtIndex(0) // a Phrase
self.player.play(instruction.sound) // sing
for action in instruction.actions {
    action() // perform the action
}
这听起来很像你想要的


(当然,你说你有Ruby背景;我刚才所说的一切在Ruby中都是一样的。作为一等公民的函数的概念对你来说并不奇怪。)

那么,你在Ruby中会怎么做呢?这并不是一个快速的问题,它更多的是关于面向对象的设计。我的建议是考虑一种数据格式来表示站点和游览。可能是JSON文件?