ChenYilong / ChenYilong/iOSInterviewQuestions
第一题建议增加NS_ASSUME_NONULL_BEGIN 和 NS_ASSUME_NONULL_END
- Dominant language
- Swift
- Stars
- 9.5k
- Forks
- 2.8k
- PR merge metrics
- No merged PRs in 30d
Description
使用`NS_ASSUME_NONULL_BEGIN` 和 `NS_ASSUME_NONULL_END`标记默认nonull区域的好处有二:
1. 限制区域内传空值操作,减少误传空值的可能性
例:
头文件
```objective-c
typedef NS_ENUM(NSInteger, CYLGender) {
CYLGenderMale,
CYLGenderFemale,
CYLGenderConfidential,
CYLGenderUnknown
};
@interface CYLUSER: NSObject
@property (nonatomic, readonly, copy) NSString *surname;
@property (nonatomic, readonly, copy) NSString *firstname;
@property (nonatomic, readonly, assign) NSUInteger age;
@property (nonatomic, readonly, assign) CYLGender gender;
@property (nonatomic, readonly, copy) NSString *title;
- (instancetype)initWithSurame:(NSString *)surname firstname:(NSString *)firstname age:(NSUInteger)age gender:(CYLGender)gender;
+ (instancetype)userWithSurame:(NSString *)surname firstname:(NSString *)firstname age:(NSUInteger)age gender:(CYLGender)gender;
- (void)updateTitle:(NSString *)title;
@end
```
调用
```objective-c
CYLUSER *user = [[CYLUSER alloc] initWithSurame:@"Chen" firstname:nil age:18 gender: CYLGenderMale]; // 无警告
NSLog(@"Hi %@ %@ %@", user.title, user.firstname, user.surname); // 输出(null) (null) Chen
```
增加NS_ASSUME_NONULL_BEGIN和NS_ASSUME_NONULL_END
头文件
```objective-c
// 略
NS_ASSUME_NONULL_BEGIN
@interface CYLUSER: NSObject
//略
@property (nonatomic, readonly, copy, nullable) NSString *title;
- (instancetype)initWithSurame:(NSString *)surname firstname:(NSString *)firstname age:(NSUInteger)age gender:(CYLGender)gender;
+ (instancetype)userWithSurame:(NSString *)surname firstname:(NSString *)firstname age:(NSUInteger)age gender:(CYLGender)gender;
- (void)updateTitle:(nullable NSString *)title;
@end
NS_ASSUME_NONULL_END
```
调用
```objective-c
CYLUSER *user = [[CYLUSER alloc] initWithSurame:@"Chen" firstname:nil age:18 gender: CYLGenderMale]; // 警告:Null passed to a callee that requires a non-null argument
[user updateTitle:nil]; // 无警告
```
2. 增加Swift - Objective-C互操作性
以上第二个例子的头文件自动生成的Swift interface更符合Swift代码风格
```Swift
import Foundation
public enum CYLGender: Int {
case male
case female
case confidential
case unknown
}
open class CYLUser: NSObject {
open var surname: String { get }
open var firstname: String { get }
open var age: UInt { get }
open var gender: CYLGender { get }
opent var title: String! { get }
public init(surname: String, firstname: String, age: UInt, gender: CYLGender)
open func updateTitle(_ title: String!)
}
```
如无标记的话自动生成的Swift interface会多很多不被倡导的强制unwrap`!`
例:
```Swift
open class CYLUser: NSObject {
open var surname: String! { get }
open var firstname: String! { get }
open var age: UInt { get }
open var gender: CYLGender { get }
open var title: String! { get }
public init!(surname: String!, firstname: String!, age: UInt, gender: CYLGender)
open func updateTitle(_ title: String!)
}
```
详见:[Nullability and Objective-C](https://developer.apple.com/swift/blog/?id=25)
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.