Deependra Dhakal
Deependra Dhakal

Reputation: 59

How can i pass class as a parameter to a function in Swift?

Let us consider i have two different classes.

class A {
var something = "Hello"
}

class B {
var something = "World"
}

Now

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
}

}

Plz help me achieve this using Swift

Upvotes: 1

Views: 4671

Answers (4)

Wez
Wez

Reputation: 10712

Let it be known that I think using a protocol is the cleanest option that will best solve your problem.

However, it is possible to use Any to pass any object as a parameter, this will require checking which class you are dealing with inside your update method.

Something like this...

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

This might be neater as a 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")
        }
    }
}

Upvotes: 0

Joakim Danielson
Joakim Danielson

Reputation: 52088

Create a protocol that both A and B conforms to and use it as the parameter type in update()

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

func update(_ o: SomeProtocol) {
    print(o.something)
}

Upvotes: 2

Scriptable
Scriptable

Reputation: 19758

Use a protocol

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
    }
}

usage:

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

print(c.update(myClass: a))

print(c.update(myClass: b))

Output:

hello

world

Upvotes: 4

David Pasztor
David Pasztor

Reputation: 54785

You cannot declare a function in Swift that could accept an input argument of several different types, so you cannot declare a type as A or B. However, you don't actually need this to solve your specific problem.

Since you want to access a common property of the two class instances, you should declare that property in a protocol, make both classes conform to that protocol, then make the function take an input argument of the protocol type.

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
    }

}

Upvotes: 6

Related Questions