在swift中将类名作为参数发送

时间:2015-02-25 18:14:14

标签: swift object protocols

如何在swift中将类名作为参数发送?这就是我想要实现的目标:

  1. 我有一个对象,我希望它将2个不同的对象(对象A,对象B)作为其初始化器的一部分。
  2. 另外,我需要确保两个对象都包含UIImageView。
  3. 示例:

    class A {
        var view: UIImageView!
        //rest of the code for object A
    }
    
    class B {
        var imageView: UIImageView!
        //rest of the code for object B
    }
    
    class C {
        init(someClass1: AnyClass, someClass2: AnyClass) {
            //make sure someClass1.imageView
            //make sure someClass2.imageView
        }
        //rest of the code for object C
    }
    

    所以,基本上我需要发送那些类名/类型来初始化类C,并且A和B符合并具有UIImageView。我想它应该是协议,但不知道如何在这里实现它。

    谢谢!

1 个答案:

答案 0 :(得分:1)

两种方法:协议或继承。协议通常是要走的路,因为它们更灵活。 Objective C中有一个巨大的协议传统,因为该语言不支持多重继承,但Swift确实如此!选择协议或继承的原因在Swift中不是基于语言的,而是纯粹基于架构的,这很好。因此,根据应用程序的结构,您应该选择最佳方法。

使用协议:

// Any class conforming to the protocol P must
// have a property called view because it is not optional
protocol P {
    var view: NSImageView? { get set }
}

class A: P {
    var view: NSImageView?
    // ...
}

class B: P {
    var view: NSImageView?
    // ...
}

class C {
    init(someClass1: P, someClass2: P) {
        if someClass1.view != nil && someClass2.view != nil {
            // ...
        }
    }
}

使用继承:

// Parent class. Any subclass already includes all the 
// properties and methods, so you don't have to redeclare them.
class P {
    var view: NSImageView?
}

class A: P {
}

class B: P {
}

class C {
    init(someClass1: P, someClass2: P) {
        if someClass1.view != nil && someClass2.view != nil {
            // ...
        }
    }
}