在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
WWDC2015的明星是Swift。在Swift语言到2.0以后会被开源,这其中包括了protocol扩展和一个新的错误处理API。 苹果的小baby已经长成,并且意料之中的获得了开发者的关注。但是在iOS开发中Object-C并不会很快的推出历史舞台。 并且在WWDC2015中介绍了ObjC的一个很好地特性。我们下面就来谈一谈ObjC的这个新特性:泛型。 我们先看一看下面的代码: class Person: NSObject {
let name: String let surname: String var friends: [Person]? init(name: String, surname: String) { self.name = name self.surname = surname } } 非常简单。这里定义了一个名为 let firstFriendName = person.friends?.first?.name
编译器知道 很好,那么在ObjC里是怎么样的呢? @interface Person : NSObject
@property(nonatomic, copy, nonnull) NSString *name; @property(nonatomic, copy, nonnull) NSString *surname; @property(nonatomic, strong, nullable) NSArray *friends; @end 在我们继续之前,我们先来聊一下nonnull和nullable这两个修饰符。这些叫做可空声明,是在Xcode6.3中引入的。 现在,我们可以回到泛型。我们无法在 id firstFriend = person.friends.firstObject;
由于Objective-C里没有泛型, Person *firstFriend = person.friends.firstObject;
NSString *fristFriendWrongTypeVariable = person.friends.firstObject; 实用正确类型的对象是我们需要处理的。如果我们用了一个错误的类型,那么在运行时这个对象会接受到一个不支持的message, 这样就会报错了。要获取第一个朋友的名字,我们需要初始化另外的一个变量: Person *firstFriend = person.friends.firstObject;
NSString *firstFriendName = firstFriend.name 这个例子非常简单,但是却明显的表明了ObjC需要额外多写一些代码,而且开发者,而不是编译器,需要负责类型的安全。 如果说ObjC急需什么Swift或者Java、C#早就已经有的特性的话,那么就一定是泛型了。幸好,Xcode7带来了一个轻量级的ObjC泛型。 @interface Person : NSObject
@property(nonatomic, copy, nonnull) NSString *name; @property(nonatomic, copy, nonnull) NSString *surname; @property(nonatomic, strong, nullable) NSArray<Person *> *friends; @end 现在我们可以定义集合里的元素类型了。 NSString *firstFriendName = person.friends.firstObject.name;
编译器知道 NSDate *firstFriendName = person.friends.firstObject.name;
我们会收到一个warning! Swift会如何引入这个ObjC的 var name: String
var surname: String var friends: [Person]? 轻量的泛型不止适用于 @property NSSet<Person *>* people;
@property NSDictionary<NSString *, Person *>* people;
另外,我们也可以在我们自定义的类型中使用这些轻量级的泛型: @interface MyCustomClass<T> : NSObject
- (void)doSomethingWithGeneric: (T)object; @end @implementation MyCustomClass - (void)doSomethingWithGeneric:(id)object { } @end MyCustomClass<NSString *> *myCostomObject = [[MyCustomClass alloc] init];
[myCostomObject doSomethingWithGeneric:@"hello, world"]; 如果我们使用错误的类型呢? [myCostomObject doSomethingWithGeneric:@100];
Xcode会给出一个警告。 但是有些东西需要注意:ObjC的自定义泛型类和泛型的集合在引入Swift之后行为并不一样。 Xcode7引入了轻量级泛型有什么好处呢?极大地减少了类型转换的代码。类型检测的责任从开发者转移到了编译器。 代码更加干净,类型更加安全。但是,这并不是全部。在Xcode7前,Swift调用ObjC的framework要非常小心。 每一个ObjC的集合元素都需要从
from:https://netguru.co/blog/objective-c-generics |
请发表评论