У меня проблема, которую нужно решить.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 onA
orB
classes it's OK.
Так что мне нужно, чтобы он был динамичным и называл этот метод самостоятельно.
В конце концов, если эта работа мне также понадобится, чтобы вернуть возвращаемое значение к типу Self.
Заранее спасибо
Гегам
Можете ли вы опубликовать 'RowConvertible' код? И обратите внимание, где ошибка, и где все в порядке. – anhtu
Я отредактировал мой вопрос, пожалуйста, посмотрите. Ошибка появляется, когда я пытаюсь вызвать fetchOne() на себе, это нормально, когда я вызываю его на классах «A» или «B». –
есть ли какая-то особая причина, почему вы не хотите идти, как 'try A.fetchOne (db, «SELECT * FROM User») '? «Поэтому мне нужно, чтобы он был динамичным и называл этот метод сам». не уверен, что вы подразумеваете под этим, если вы вызываете его на A, он должен всегда работать на любых подклассах. – Fonix