2017-02-15 9 views
2

У меня проблема, которую нужно решить.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.

Заранее спасибо

Гегам

+1

Можете ли вы опубликовать 'RowConvertible' код? И обратите внимание, где ошибка, и где все в порядке. – anhtu

+0

Я отредактировал мой вопрос, пожалуйста, посмотрите. Ошибка появляется, когда я пытаюсь вызвать fetchOne() на себе, это нормально, когда я вызываю его на классах «A» или «B». –

+0

есть ли какая-то особая причина, почему вы не хотите идти, как 'try A.fetchOne (db, «SELECT * FROM User») '? «Поэтому мне нужно, чтобы он был динамичным и называл этот метод сам». не уверен, что вы подразумеваете под этим, если вы вызываете его на A, он должен всегда работать на любых подклассах. – Fonix

ответ

1
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

спасибо много !!! –