如何构建对象层次结构,使所有名词都是单词而不是所有单词都是名词

时间:2014-11-28 06:28:14

标签: arrays class swift tableview superclass

我有几个代表用swift编写的词性(名词,动词,形容词,代词......)的类。我想在同一个表视图中显示这些类的实例。所有这些类都是单词的类型,所以在技术上应该有一个名为word的类,它是noun.swift,verb.swift,adjective.swift和其他类的超类。并非所有这些单词类型都具有相同的成员变量。我应该如何将这些对象作为不同类型的单词进行协调。

或者我一直在考虑制作Any类型的数组并向其添加不同类型的对象。该数组将保存表视图中的所有值。那里的问题是将未声明类型的对象传递给detailViewController。

如果有人对如何进行任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:3)

如果名词,动词等实际上是单词类型,那么必须才能在类型层次结构中捕获。只要您编写class Noun然后class Verb,就需要停止并定义超类。

class Word {}
class Noun : Word { /* ... */ }
class Verb : Word { /* ... */ }

以上是最低限度;起点。在此处,您可以在WordNoun分享内容时向Verb添加状态或行为。

现在你可以拥有单词数组。当然,如果没有与Word相关联的状态或行为,那么该数组的所有用户将永远向下转换为其中一个子类型:

override func tableView (tableView: UITableView, 
 cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

  let cell = ...
  let word = words[indexPath.row]

  if let noun = word as? Noun { cell.text = /* noun stuff */ }
  else if let verb = word as? Verb { cell.text = /* verb stuff */ }

  return cell
}

但我怀疑,一旦你定义了Word,你就会发现要放入其中的内容,这会使上面的word as? Noun代码变得更加繁琐。

关于类型层次结构的注意事项:我严格地说,名词和动词实际上是parts of speech,并且一个单词可以与多个词性相关联。建模如下:

class PartOfSpeech {}
class Noun : PartOfSpeech {}
class Verb : PartOfSpeech {}

class Word { var partsOfSpeech : Set<PartOfSpeech> }