Как я могу передать класс в качестве параметра функции в Swift? - PullRequest
0 голосов
/ 28 февраля 2019

Давайте рассмотрим, у меня есть два разных класса.

class A {
var something = "Hello"
}

class B {
var something = "World"
}

Теперь

class C {

func request() {

    //Call with class A or B it can contain any class. I can call either class A or B depending on condition
    update(myClass: A or B)
}

func update(myClass:A or B ) {
    print(myClass.something) //Since both class have same varaible var something so this code should work either i pass class A or B through function
}

}

Плз, помогите мне добиться этого с помощью Swift

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Пусть будет известно, что я думаю, что использование protocol - это самый чистый вариант, который наилучшим образом решит вашу проблему.

Однако, возможно дляиспользуйте Any для передачи любого объекта в качестве параметра, для этого потребуется проверить, с каким классом вы работаете внутри вашего метода обновления.

Что-то вроде этого ...

class C {
    func update(myClass: Any) {
        if let a = myClass as? A {
            print(a.something)
        }
        if let b = myClass as? B {
            print(b.something)
        }
    }
}

Это можетбыть аккуратнее как switch - ref

class C {
    func update(myClass: Any) {
        switch myClass {
        case let a as A:
            print(a.something)
        case let b as B:
            print(b.something)
        default:
            print("not a thing")
        }
    }
}
0 голосов
/ 28 февраля 2019

Использовать протокол

protocol MyProtocol: class {
    var something: String { get set }
}

class A: MyProtocol {
    var something = "Hello"
}

class B: MyProtocol {
    var something = "world"
}

class C {
    func update(myClass:MyProtocol ) {
        print(myClass.something) //Since both class have same varaible var something so this code should work either i pass class A or B through function
    }
}

Использование:

let a = A()
let b = B()
let c = C()

print(c.update(myClass: a))

print(c.update(myClass: b))

Вывод:

привет

мир

0 голосов
/ 28 февраля 2019

Создайте протокол, которому соответствуют A и B, и используйте его как тип параметра в update ()

protocol SomeProtocol {
    var something: String {get set}
}

func update(_ o: SomeProtocol) {
    print(o.something)
}
0 голосов
/ 28 февраля 2019

Вы не можете объявить функцию в Swift, которая может принимать входной аргумент нескольких различных типов, поэтому вы не можете объявить тип как A or B.Однако на самом деле это вам не нужно для решения вашей конкретной проблемы.

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

protocol SomethingProtocol {
    var something: String { get }
}

class A: SomethingProtocol {
    let something = "Hello"
}

class B: SomethingProtocol {
    let something = "World"
}

class C {
    func request() {
        //Call with class A or B it can contain any class. I can call either class A or B depending on condition
        update(something: A())
        update(something: B())
    }

    func update(something: SomethingProtocol) {
        print(something.something) //Since both class have same varaible var something so this code should work either i pass class A or B through function
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...