Swift 在泛型中快速使用Self&;协议(在方法级别没有Init)
更新: 这个问题投票结束了这个问题,因为重复处理了Swift 在泛型中快速使用Self&;协议(在方法级别没有Init),swift,generics,Swift,Generics,更新: 这个问题投票结束了这个问题,因为重复处理了self.init(),这可以通过标记类final或要求init来解决。但是,除了init(我的实现是@NSManaged Object),它如何在存储库上工作或从任何其他方法返回呢 这是我想做的。通过请求获取JSON,然后将其解析为对象 var req = Request("http://somewhere/story/get/1") var story = req.parseJsonResponse() as Story 请求类看起来像这样
self.init()
,这可以通过标记类final或要求init来解决。但是,除了init
(我的实现是@NSManaged Object),它如何在存储库上工作或从任何其他方法返回呢
这是我想做的。通过请求获取JSON,然后将其解析为对象
var req = Request("http://somewhere/story/get/1")
var story = req.parseJsonResponse() as Story
请求
类看起来像这样:
class Request {
public var httpJsonResponse : String
init(_ url : String) {
//This comes from HTTP
httpJsonResponse = "{}"
}
public func parseJsonResponse<T : IParse>() -> T {
return T.parse(json: httpJsonResponse)
}
}
到目前为止,很好,实施中存在以下问题:
class Story : IParse {
required init()
{
}
public static func parse(json: String) -> Self
{
//return self.init() works thanks to @tomahh
return StoryRepo.ById(1)
}
}
class StoryRepo {
public static func ById(_ id : Int) -> Story {
return Story()
}
}
这是行不通的。这两项工作都不起作用:
Story()转换为!自我
Self
的实例,这样Story
的子类就不会创建一个无聊的故事,而是一个精彩的故事
required
关键字强制子类重写此init,因此我们确信在parse中实际调用self.init()
是有效的
如果您不想与继承作斗争,另一个解决方案是将故事
classfinal
final Story: IParse {
public static func parse(json: String) -> Story {
return Story()
}
}
在本例中,由于Story
永远不会从中继承,因此可以安全地调用Story()
并从parse
函数返回Story
类型。在我的游乐场上也不起作用。无论我是否理解它或它是一个bug无法将“Story”类型的返回表达式转换为“Self”类型的返回表达式。
可能与Story
final
重复,或者实现所需的初始化器,并在静态方法中调用该初始化器。@Hamish以防我们返回值?@tika我不确定是否理解您的意思。将类标记为final
可以实现这一点,而无需添加必需的
初始化器。这不起作用。你能在操场上试试吗<代码>使用未解析标识符“Self”返回Self()
Oops,我用有效代码更新了答案。很抱歉,第一篇文章有误导性。我正在更新更多的解释现在!请参阅更新的部分。如何使用其他方法的结果来实现它?
class Story : IParse {
required init()
{
}
public static func parse(json: String) -> Self
{
return self.init()
}
}
final Story: IParse {
public static func parse(json: String) -> Story {
return Story()
}
}