SWIFT:静态方法中的协议功能在“自我”上不可见

问题描述:

我有一个要解决的问题。SWIFT:静态方法中的协议功能在“自我”上不可见

这是需要作的工作的代码:

class A: NSObject, RowConvertible { 

    /// Initializes a record from `row`. 
    /// 
    /// For performance reasons, the row argument may be reused during the 
    /// iteration of a fetch query. If you want to keep the row for later use, 
    /// make sure to store a copy: `self.row = row.copy()`. 
    public required init(row: Row) { 
     print(row) 
    } 
} 

extension A 
{ 
    public static func currentUser() -> Self? 
    { 
     // By key 
     let userType = type(of:self) 
     let user = try! dbQueue.inDatabase { db in 

      try self.fetchOne(db, "SELECT * FROM User") 
     } 

     return user 
    } 

} 

class B: A 
{ 

} 

let user = B.currentUser() 
print(user) 

RowConvertible是含有fetchOne()方法的协议。

RowConvertible是GRDB.swift开源库的一部分:

public protocol RowConvertible { 

    public static func fetchOne(_ db: Database, _ sql: String) 
} 

所以问题是,当我试图调用fetchOne()自我静态方法,我得到错误:

Type 'Self' has no member fetchOne but when I'm calling it on A or B classes it's OK.

所以我需要保持它的动态,并在自我调用该方法。

毕竟,如果这项工作,我还需要将返回的值转换为Self类型。

在此先感谢

Gegham

+1

能否请您发表您的'RowConvertible'代码?请注意,错误出现在哪里以及哪里没有问题。 – anhtu

+0

我编辑了我的问题,请看看。当我尝试在自我上调用fetchOne()时出现错误,当我在“A”或“B”类上调用它时没关系 –

+0

是否有一个特别原因,您不想尝试使用A.fetchOne (db,“SELECT * FROM User”)'? “所以我需要保持它的动态,并且自我调用这个方法。”不知道你是什么意思,如果你打电话给它它应该总是在任何sublcasses – Fonix

protocol PrintProtocolTest { 
    static func printTest() 
} 

extension PrintProtocolTest { 
    static func printTest() { 
     print(self) 
    } 
} 

class A: PrintProtocolTest { 
} 

extension A { 
    static func test() { 
     self.printTest() 
    } 
} 

class B: A 
{ 

} 

B.test() /// <--- print 'B' here 

你可以得到的结果

B

你的代码是正确的。使用self即可。

有了回报

protocol PrintProtocolTest { 
    static func printTest() 
} 

extension PrintProtocolTest { 
    static func printTest() { 
     print(self) 
    } 
} 

class A: PrintProtocolTest { 
    required init() { 

    } 
} 

extension A { 
    static func test() -> PrintProtocolTest { 
     self.printTest() 
     return self.init() 
    } 
} 

class B: A 
{ 

} 

B.test() // <--- return B instance here 
+0

感谢您的帮助,理解它为什么不起作用真的很有帮助,但问题仍然存在。 当我在静态函数'加入返回类型 - >自','self.printTest()'不工作 @anhtu –

+0

@GeghamHarutyunyan我编辑我的答案,你可以用返回b – anhtu

+0

谢谢很多! –