Протокол функции доступа в классе generi c - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу получить доступ к функции в протоколе, но жалоба XCode

Элемент экземпляра 'createColumns' не может использоваться для типа 'T'; Вы хотели использовать вместо этого значение этого типа?

Что я сделал:

Создание протокола:

protocol StorageModelDelegate {
   func createColumns(for tableBuilder: TableBuilder)
}

Создание класса generi c которые получают StorageModelDelegate:

class SQLiteStorage<T: StorageModelDelegate> {
     func createTable(tableName: TableKey) -> Bool {
           let table = Table(tableName.rawValue)

           let query = table.create(ifNotExists: true) { (builder: TableBuilder) in
                T.createColumns(for: builder) // -> this is the error comes up.
           }
     }
}

Создать класс, реализующий SQLiteStorage:

final class InfoStorageModel {
    private let sqlite: SQLiteStorage = SQLiteStorage<Info>()
}

Итак, как исправить ошибку в классе SQLiteStorage?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Ошибка указывает, что вам нужен экземпляр из T, а не тип .

Итак, вам нужно что-то вроде:

class SQLiteStorage<T: StorageModelDelegate> {
    var delegate:T

    init (delegate:T) {
      self.delegate = delegate
    }

    func createTable(tableName: TableKey) -> Bool {
          let table = Table(tableName.rawValue)

          let query = table.create(ifNotExists: true) { (builder: TableBuilder) in
                self.delegate.createColumns(for: builder) // -> this is the error comes up.
          }
    }
}
1 голос
/ 17 февраля 2020

Вы хотите вызвать метод stati c вместо метода экземпляра.

Для исправления необходимо добавить параметр экземпляра:

Прежде всего, используйте слабый делегат var в порядке для предотвращения сохранения циклов.

protocol StorageModelDelegate: class {
   func createColumns(for tableBuilder: TableBuilder)
}

final class SQLiteStorage<T: StorageModelDelegate> {
weak var delegate: T?
     func createTable(tableName: TableKey) -> Bool {
           let table = Table(tableName.rawValue)

           let query = table.create(ifNotExists: true) { (builder: TableBuilder) in
                delegate?.createColumns(for: builder)
           }
     }
}

Или используйте методы протокола stati c:

protocol StorageModelDelegate {
   static func createColumns(for tableBuilder: TableBuilder)
}


final class SQLiteStorage<T: StorageModelDelegate> {
weak var delegate: T?
     func createTable(tableName: TableKey) -> Bool {
           let table = Table(tableName.rawValue)

           let query = table.create(ifNotExists: true) { (builder: TableBuilder) in
                T.createColumns(for: builder)
           }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...