我有几个代表用swift编写的词性(名词,动词,形容词,代词......)的类。我想在同一个表视图中显示这些类的实例。所有这些类都是单词的类型,所以在技术上应该有一个名为word的类,它是noun.swift,verb.swift,adjective.swift和其他类的超类。并非所有这些单词类型都具有相同的成员变量。我应该如何将这些对象作为不同类型的单词进行协调。
或者我一直在考虑制作Any类型的数组并向其添加不同类型的对象。该数组将保存表视图中的所有值。那里的问题是将未声明类型的对象传递给detailViewController。
如果有人对如何进行任何建议,将不胜感激。
答案 0 :(得分:3)
如果名词,动词等实际上是单词类型,那么必须才能在类型层次结构中捕获。只要您编写class Noun
然后class Verb
,就需要停止并定义超类。
class Word {}
class Noun : Word { /* ... */ }
class Verb : Word { /* ... */ }
以上是最低限度;起点。在此处,您可以在Word
和Noun
分享内容时向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> }