2015-10-27 3 views
2

Я хочу использовать self в статическом методе как тип класса, но я получаю ошибку времени компиляции.Swift self in static method

Вот мой тестовый код:

protocol JSONMappable { 
    static func map(JSON: AnyObject!) -> Self 
} 

class Model : JSONMappable, Mappable { 
    required init?(_ map: Map){ 

    } 

    func mapping(map: Map) { 

    } 

    static func map(JSON: AnyObject!) -> Self { 
     return Mapper<self>().map(JSON) 
    } 
} 

Так что в статической карте метод я хочу использовать себя как тип класса, я также попытался self.Type, но я получаю ту же ошибку. Я не хочу использовать имя класса, потому что мне нужен этот метод для использования имени класса subclass, когда он будет вызываться на subclass. например, если у меня будет:

class SubClass : Model { 

} 

и называют:

SubClass.map(JSON) 

мне нужно иметь SubClass в этом методе вместо Model. Так что мне интересно, возможно ли это сделать?

+0

почему бы вам нужно вернуть себя? – Lukas

+0

@ Lukas - попытка вернуть экземпляр типа –

ответ

0
protocol A { 
    static func f()->Self 
} 
// class should conform to protocol A, so the returned type should be B 
final class B: A { 
    static func f() -> B { 
     return B() 
    } 
} 

let b = B() 
let c = B.f() 

Я не вижу никакого практического применения, поскольку конечный класс не может быть подклассами и implemet своего протокола, класс должен быть объявлен как окончательные

, кстати, это означает, что один и тот же

protocol A { 
    static func f()->Self 
} 

final class B: A { 
    class func f() -> B { 
     return B() 
    } 
} 

без статического

protocol A { 
    func f()->Self 
} 

class B: A { 
    func f()->Self { 
     return self 
    } 
} 
let a = B() 
let b = a.f()