Swift泛型和协议问题

3

我正在尝试在我的应用程序中推广MVVM模式,但是使用Swift和泛型却发现相当困难。例如:

我有一个位于模型层的Comic结构体。但是我希望我的viewControllers消耗符合ComicViewModel协议的对象,以增加关注点分离。

我将模型结构体包装在一个名为Box的类中,定义如下:

public class Box<T> {
    public let value: T
    public init(_ value: T) { self.value = value }
}

这仅用于将实际返回值包装在类似于此处解释的Result枚举中。

然而,尽管我明确定义了,但Swift编译器似乎不喜欢从ComicComicViewModel的转换。

func sampleComics() -> Box<Comic> {...}
protocol ComicViewModel {...}
extension Comic : ComicViewModel {...}

func fetchComicsViewModel() -> Box<ComicViewModel> {
    return sampleComics() //ERROR
}

完整的实验室可以在这里找到。

非常感谢您的帮助!

1个回答

1
很遗憾,Swift不会自动执行这样的隐式转换。目前,您需要重新使用Box()对该值进行封装。
func fetchComicsViewModel() -> Box<ComicViewModel> {
    return Box(sampleComics().value)
}

请参考在开发者论坛上的这个主题:https://devforums.apple.com/message/1101023#1101023 - rintaro
很遗憾听到这个消息...因为它不仅仅是将值进行Box处理那么简单,我还需要深入转换许多其他层次的内容以绕过这个编译器限制。 - Pierluigi Cifani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接