Skip to main content
 首页 » 操作系统

arrays之如何构建对象层次结构,使所有名词都是单词但并非所有单词都是名词

2024年01月01日36myhome

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

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

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

请您参考如下方法:

如果名词、动词等实际上是词的类型,那么必须在类型层次结构中捕获。一旦您编写了 class Noun,然后是 class Verb,您需要停止并定义父类(super class)。

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 成为?名词代码不那么繁琐。

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

class PartOfSpeech {} 
class Noun : PartOfSpeech {} 
class Verb : PartOfSpeech {} 
 
class Word { var partsOfSpeech : Set<PartOfSpeech> }