Swift Nullability and Objective-C
通过Bridging-Header文件,Swift可以与Objective-C无缝调用,但是Swift与Objective-C有一个很大的不同点:Swift支持 在早期发布的Xcode版本中,苹果的一些框架针对Swift的Optional类型进行了一些专门审查,使他们的API能够适配Optional,而Xcode 6.3的发布,给我们带来了Objetive-C的一个新特性: 核心:__nullable 和 __nonnull这个功能给我们带来了两个新的类型注解: @interface AAPLList : NSObject <NSCoding,NSCopying>
//---
- (AAPLListItem * __nullable)itemWithName:(NSString * __nonnull)name;
@property (copy,readonly) NSArray * __nonnull allItems;
//---
@end
//--------------
[self.list itemWithName:nil]; // warning!
你能在任何地方使用 - (nullable AAPLListItem *)itemWithName:(nonnull NSString *)name; - (NSInteger)indexOfItem:(nonnull AAPLListItem *)item;
对于 @property (copy,nullable) NSString *name;
@property (copy,readonly,nonnull) NSArray *allItems;
不带下划线的形式比带下划线的形式看起来更简洁,但你仍然需要将它们应用到头文件的每一个类型里。如果你觉得麻烦同时想让头文件变得更加简洁,你就会使用到审查区域。 审查区域(Audited Regions)如果想更加轻松的添加这些注解,那么你可以把Objective-C头文件的某个区域标记为需要审查(for nullability),在这个区域内,所有简单的指针类型都会被当作 NS_ASSUME_NONNULL_BEGIN
@interface AAPLList : NSObject <NSCoding,NSCopying>
//---
- (nullable AAPLListItem *)itemWithName:(NSString *)name;
- (NSInteger)indexOfItem:(AAPLListItem *)item;
@property (copy,nullable) NSString *name;
@property (copy,readonly) NSArray *allItems;
//---
@end
NS_ASSUME_NONNULL_END
// --------------
self.list.name = nil; // okay
AAPLListItem *matchingItem = [self.list itemWithName:nil]; // warning!
为了安全起见,这个规则也有一些例外情况:
你可以通过Error Handling Programming Guide了解更多详细内容。 兼容性你的Objective-C框架现有的代码写对了吗?是否能安全的改变它们的类型? Yes,it is.
大多数情况下,应该接受 回到Swift现在我们给我们的Objective-C头文件添加了nullability注解,我们在Swift中使用它: class AAPLList : NSObject,NSCoding,NSCopying {
//---
func itemWithName(name: String!) -> AAPLListItem!
func indexOfItem(item: AAPLListItem!) -> Int
@NSCopying var name: String! { get set }
@NSCopying var allItems: [AnyObject]! { get }
//---
}
添加注解之后: class AAPLList : NSObject,NSCopying {
//---
func itemWithName(name: String) -> AAPLListItem?
func indexOfItem(item: AAPLListItem) -> Int
@NSCopying var name: String? { get set }
@NSCopying var allItems: [AnyObject] { get }
//---
}
这些Swift代码非常清晰。只有一些细节的变化,但是它让你的框架使用起来更爽。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |