2015-02-26 100 views
3

我试图在我的应用程序上推送MVVM模式,但我发现使用Swift和泛型非常困难。例如:Swift的泛型和协议问题

我的模型图层上有一个Comic结构。但我希望我的viewControllers消费符合ComicViewModel协议的对象,以增加顾虑的分离。

我包裹在一个名为Box类的模型结构是这样定义的:

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

这仅用于在Result枚举来包装实际的返回值就像一个解释here

然而,Swift编译器似乎并不喜欢从ComicComicViewModel的演员阵容,即使我明确定义了演员阵容:

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

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

有充分的操场here

非常感谢您的帮助!

回答

1

很遗憾,Swift不会像那样执行隐式转换。截至目前,你必须重新编号Box()的值。

func fetchComicsViewModel() -> Box<ComicViewModel> { 
    return Box(sampleComics().value) 
} 
+0

见关于devforums这个话题:https://devforums.apple.com/message/1101023#1101023 – rintaro

+0

非常伤心,听到这个......因为它并不像'Box'ing值那么简单,为了解决这个编译器限制,我还有很多其他层要深入并进行转换 –