быстрая генерация динамических методов - PullRequest
1 голос
/ 02 июня 2019

Я создаю расширение для UITableViewCell и даю метод по умолчанию. С помощью метода set<T: UITableViewCell> я хочу, чтобы метод setupData мог динамически отправлять данные по типу ячейки. Но это всегда не удавалось, и в результате переход к fatalError.


import UIKit

class cell: UITableViewCell {
    func setupData<T>(_ data: T) {
        print(#function)
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        set(cell.self)
    }

    func set<T: UITableViewCell>(_ t: T.Type) {
        let cell = T()
        cell.setupData(1)
    }
}

protocol Action {
    func setupData<T>(_ data: T)
}

extension Action {
    func setupData<T>(_ data: T) {
        fatalError("This method is abstract, need subclass.")
    }
}

extension UITableViewCell: Action {}


1 Ответ

1 голос
/ 02 июня 2019

Вещи в расширении всегда отправляются статически.В set, cell.setupData(1) уже связан с реализацией в расширении во время компиляции.

Я не понимаю, зачем вам это расширение в любом случае, вам нужно только:

class cell: UITableViewCell, Action {
    func setupData<T>(_ data: T) {
        print(#function)
    }
}

protocol Action {
    func setupData<T>(_ data: T)
    init()
}

...

func set<T: Action>(_ t: T.Type) {
    let cell = T()
    cell.setupData(1)
}
...