会弱化Swift代码和可读性
很遗憾,Swift支持泛型(generics)就意味着ob
Nullability Annotations
单单一个属性就引发了这么多担忧,还挺让人不安的。如果代码本身引发很多质疑,出现error的可能性就大大增加,更别提在广为熟知的ob
@property (strong, nonatomic, nonnull) NSArray *someViews;
intent.大大提升了ob
泛型的出现,泛型的缺席一直以来是ob
现在可以定义属性,下指令给编译器来显示所有UIView:
@property (strong, nonatomic, nonnull) NSArray<UIView *> *someViews;
向属性强加UIView之外的东西时,编译器会报错,而且如今不用做大量头痛的转换(cast)了。
ob
再进一步,可以用参数来表示扩展(extensions)、类别(categories)和类(classes),好处不仅仅体现在集合(collections)上。泛型的强大体现在整个ob
type erasure不但能实现二进制兼容,而且不改变ob
KindOf Types,再次调用之前定义的属性,就会显示UIView。判断里面包含着views和buttons是再正常不过的事。这种情况下,添加如下代码会发生什么呢?
[self.someViews[0]addTarget:selfaction:selector(aMethod:)
forControlEvents:UIControlEventTouchUpInside];
编译器警告,因为即便可以在这个属性里插入一个button,就算可以假设是个UIView,button也不一定没有经过转换,现在新的KindOf特性能够轻松解决这种始料未及的情况:
@property (strong, nonatomic, nonnull) NSArray<__kindof UIView *> *someViews;
实际上编译器已经知道了:属性及其集合会出现一些UIView。这样在类型协议里显示更多我们之前看不到的信息,其本质是向下转型(downcasting)。这意味着上述代码编译没什么问题,因为编译器知道集合里肯定会出现一个button,现在那些担忧就都解释得清了。
虽然不喜欢Swift的人可能会刻意夸大ob
虽然如今Swift正以迅雷不及掩耳之势蚕食着ob
http://yuantuan.com
最佳答案