Функция, принимающая общие параметры - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть подкласс NSManagedObject.Я использую протокол для создания класса-оболочки.В моем контроллере данные могут быть: Items или Item1.Чтобы использовать мой function, мне нужно будет добавить протокол ItemInfo к Items, но это означает, что мне придется добавить

var items: Items { return self }

в Items, что выглядит какнемного избыточно.Я попытался создать базовый класс, но это не сработало.


Вопрос:

Есть ли лучший способ, позволяющий моей функции принимать Items и Item1в качестве параметра, как при использовании дженериков?


NSManagedObject:

class Items: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var code: String
}

Protocol:

protocol ItemInfo {
    var item: Items { get }
}

extension ItemInfo {

    var name : String { return item.name }
    var code : String { return item.code }
}

Wrapper:

class Item1: ItemInfo {
    let item: Items

    init(item: Items) { self.item = item }
}

function:

func handleItem(item: ItemInfo) {
    print(item.name)
    print(item.code)
}

Я мог бы использовать:

func handleItem<T>(item: T) {
    if let a = item as? Items {
        print(a.name)
        print(a.code)
    }

    if let a = item as? ItemInfo {
        print(a.name)
        print(a.code)
    }
}

Но это не совсем правильный путь ...

1 Ответ

0 голосов
/ 15 сентября 2018

Если я правильно понимаю, чего вы пытаетесь достичь (функция принимает два вида элементов), я бы использовал протокол в качестве типа, принятого функцией, ссылайтесь на код ниже

class Items: NSManagedObject, ItemInfo {

    @NSManaged var name: String
    @NSManaged var code: String
}

class Item1: NSManagedObject, ItemInfo {

    @NSManaged var name: String
    @NSManaged var code: String
}

protocol ItemInfo {
    var name: String {get set}
    var code: String {get set}
}

и функция будет выглядеть такэто

func handle(item: ItemInfo) {
    print(item.code)
    print(item.name)
}
...