【问题标题】:How to add an item from another class? Swift如何添加另一个类的项目?迅速
【发布时间】:2021-07-08 13:13:34
【问题描述】:

我正在做一个新闻管理练习。我有一些课程:

  • 作者
  • 新闻(父亲)
  • NewsVideo(子)(该类与父类具有相同的属性,另外还有两个属性)
  • 新闻管理

从 NewsManagement 类中,我必须创建一个插入新闻的函数。 我已经创建了一个新闻类型的空数组。 NewsManagement 类只有一个属性,一个空的 News 数组。

var newsCollection: [News] = []
class NewsManagement {
    
    var news: [News] = []
    
    init(news: [News]) {
        self.news = news
    }

func insertNews(title: String, text: String, date: Int, author: Autore, urlVideo: String?, videoLength: Double?) -> String? {
        
        //these are the properties of the newsVideo class
        guard let urlVideo = urlVideo, let videoLength = videoLength else {
            return nil
        }
        self.news.append(News.init(title: String, text: String, date: Int, author: Author))
        return "news addition”
    }
}
var manager = NewsManagement.init(news: newsCollection)
manager.insertNews(title: "prima prova", text: "spero funzioni", date: 13, author: authors[3], urlVideo: "www.prova.it", videoLength: 4.5)
//authors is an array of instance of class Author

不幸的是,它不起作用。 你知道错误在哪里吗? 或者你知道另一种方式吗? 我已经尝试了很长时间的解决方案,但它们都不起作用

谢谢!

【问题讨论】:

  • 为什么 NewsVideo 是 News 的子类?您不能只将 NewsVideo 作为 News 中的可选属性吗?
  • 当你说它不工作时,你是说当你输入视频时它什么都不做?
  • 在这一行 News.init(title: String, text: String, date: Int, author: Author) 你没有向构造函数发送参数。看来这是一个编辑器占位符。尝试像 News.init(title: title, text: text, date: date, author: author) 一样,还有,为什么你需要 var newsCollection: [News] = [] 这一行?

标签: ios swift function class


【解决方案1】:

句法问题

有几个语法问题会阻止代码编译。

Autore 不是Author 有一个小错字。

然后是更大的语法问题:替换没有为参数提供任何值的行:

    self.news.append(News.init(title: String, text: String, date: Int, author: Author))

带有指定命名参数的行:

   self.news.append(News.init(title: title, text: text, date: date, author: author))

顺便说一句,不需要显式调用init。当属性和参数之间没有歧义时,没有必要使用 self 。所以你可以进一步简化:

   news.append(News(title: title, text: text, date: date, author: author))

不相关:设计问题

向新闻经理提供创建News 的所有参数是一个设计问题:

  • 要添加新闻,必须向新闻管理器提供各种新闻所需的所有参数。

  • 新闻经理不仅有责任管理新闻收集,它突然有额外的责任来创建每个News。因此,如果添加了一种新的News(例如AudioNews),或者如果其中一个新闻构造函数将更改,则新闻管理器也必须更改。考虑到Single Responsibility Principle 的问题,改变的原因不止一个。

  • 新闻管理器还必须知道每种可能的新闻的每个构造函数的详细信息。并且它必须知道哪些参数创建哪种新闻的规则。所以它需要比真正需要的更多地了解很多类。鉴于Principle of Least Knowledge

    ,这可能被视为一个问题
  • 更糟糕的是,insertNews() 的界面包含许多并不总是需要的参数。鉴于interface segregation principle,这是一个问题。

我的建议:使用正确类型的新闻(例如 VideoNews)和适当的构造函数单独创建 News,并简化 NewsManager 以插入、访问和删除已经存在的新闻。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2022-11-20
    • 1970-01-01
    • 2013-10-30
    相关资源
    最近更新 更多