ChenYilong / ChenYilong/iOSInterviewQuestions

第一题建议增加NS_ASSUME_NONULL_BEGIN 和 NS_ASSUME_NONULL_END

Open
#96 0 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.