struct MyRect : CGRect {...}
在swift中是否有可能对一个结构进行子类化?
我已经在苹果官网上找到了一个例子:此示例扩展CGRect结构以包含计算面积属性:
extension CGRect {
var area: CGFloat {
return width * height
}
}
let rect = CGRect(x: 0.0, y: 0.0, width: 10.0, height: 50.0)
let area = rect.area
如何定义一个结构的子类?
4条答案
按热度按时间jum4pzuy1#
在Swift中
struct
不可能被子类化,只有类可以被子类化。extension
不是子类,它只是在现有的struct
上添加了额外的功能,这与Objective-C中的类别类似。请参阅Apple Swift documentation here以了解
struct
和class
之间的差异。vsdwdz232#
在Swift中,你不能对结构进行子类化,但在某种意义上,你可以通过创建一个结构来模拟子类化,该结构只提供你想要子类化的结构。例如,如果你想对
Calendar
(一个结构)进行子类化,你可以创建一个返回已配置日历的结构。如何销售配置的结构(作为示例属性、静态属性、静态函数等)只是一个问题,即什么更适合您的应用程序,坦率地说,这取决于个人喜好。
b5lpy0ml3#
从Swift 5.1开始,现在可以执行与您要求的类似操作:使用合成,有
KeyPath
和dynamicMemberLookup
。请看:https://medium.com/@acecilia/struct-composition-using-keypath-and-dynamicmemberlookup-kind-of-struct-subclassing-but-better-6ce561768612?source=friends_link&sk=da479578032c0b46c1c69111dfb6054ezbdgwd5y4#
这是一个有点老的,但我偶然发现它,并认为我会张贴一个常用的模式,我用在需要的时候。例如,一个应用程序,我正在做的需要做一些工作与AspectRatio。嗯,在我看来,一个AspectRatio只不过是一个CGSize与一些额外的功能。我想一个小的分离之间的AspectRatio和CGSize。所以我创建了一个TypeAlias,然后创建了一个TypeAlias的扩展。
大概是这样的
然后我可以很容易地定义如下变量: