我正在考虑使用Swift 4:
考虑以下结构class BaseClass {
// abstract function
func doSomething<T: BaseClass>(with object: T) {}
}
class SubClass: BaseClass {
var title: String = "hello world"
// implementation
override func doSomething<T: BaseClass>(with object: T) {
// do something with object
// can I access object.title here?
}
}
在上面的摘要中,object.title
属性无法访问,因为object
的类型是BaseClass
,而不是SubClass
。
我假设应将函数参数类型设置为Self
,例如:
func doSomething(with object: Self) {}
,但是在编译时发生以下错误。
'Self' is only available in a protocol or as the result of a method in a class; did you mean 'BaseClass'?
有没有一种方法来引用基于基类覆盖功能的自我类型?
编辑
所以我的问题是我们是否可以访问覆盖超级类函数的函数中的SubClass
的属性(因为object.title
属性在SubClass
实现中)。我正在考虑继承基础类的大量类,因此我认为具有与另一个实例相互作用的函数在称为同一类型的函数可能很有用。
您不能创建函数kike func doSomething(with object: Self) {}
,因为这意味着这些类别的不同事物(因此,语义上不会互相覆盖)
考虑使用BaseClass
对象调用子类,即Subclass
,如果您像在摘要中显示的Self
方法一样,它将由SupperClass实现,但是该子类将不再实现。
但是,您可以在子类中这样的施放:
override func doSomething<T: BaseClass>(with object: T) {
guard let subClass = object as? SubClass else { return }
print("(title): (subClass.title)")
}