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()
    是有效的


    如果您不想与继承作斗争,另一个解决方案是将
    故事
    class
    final

    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()
      }
    }