读EffectiveObjective-C2.0(第三条、第四条

2020-10-20  本文已影响0人  LazyLoad

第三条:多用字面量语法,少用与之等价的方法

NSString *someString = @"Effective Objective-C";
NSNumber *someNumber = [NSNumber numberWithInt:1];

如果使用字面量,就会变得十分的简洁

NSNumber *someNumber = @1;
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.1;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @'a';
int x = 5;
float y = 6.32;
NSNumber *expressionNumber = @(x * y);
NSArray *animals = [NSArray arrayWithObjects:@"dog", @"cat", "mouse", @"badger", nil];

使用字面量语法创建数组:简单、易操作

NSArray *animals = @[@"dog", @"cat", @"mouse", @"badger"];
NSString *dog = [animals objectAtIndex:0];

使用字面量语法:

NSString *dog = animals[0];

这种方式明显更加简单,和其他语言获取元素方式相似。

注意:使用字面量语法创建的数组中的元素不能为nil,如果数组中的元素为nil,就会抛出异常

NSString *object1 = @"dog";
NSString *object2 = @"cat";
NSString *object3 = @"mouse";

NSArray *array1 = [NSArray arrayWithObjects:object1, object2, object3, nil];
NSLog(@"%@", array1);
NSArray *array2 = @[object1, object2, object3];
NSLog(@"%@", array2);

上述代码:二者打印的结果是一致的,没有任何问题。

NSString *object1 = @"dog";
NSString *object2 = nil;
NSString *object3 = @"mouse";

NSArray *array1 = [NSArray arrayWithObjects:object1, object2, object3, nil];
NSLog(@"%@", array1);
NSArray *array2 = @[object1, object2, object3];
NSLog(@"%@", array2);
NSDictionary *personData = [NSDictionary dictionaryWithObjectsAndKeys:@"Matt", @"firstName", @"Galloway", @"lastName", [NSNumber numberWithInt:28], @"age", nil];
NSDictionary *personData = @{
    @"firstName": @"Matt",
    @"lastName": @"Galloway",
    @"age": @28
};

注意:字典和数组中的元素都必须是对象类型,与数组一样,使用字面量语法创建的字典,如果遇到nil,便会抛出异常,而dictionaryWithObjectsAndKeys:方法会在遇到nil之前的时候停下。

NSString *lastName = [personData objectForKey:@"lastName"]; // 非字面语法
NSString *lastName = personData[@"lastName"]; // 字面量语法

第四条:多用类型常量,少用#define预处理指令

编写代码时经常使用到常量。例如:设置视图的动画时长,而且动画时长在多个位置都会使用到。通常会把时长抽取为常量,在需要的位置直接调用即可,方便管理。

我们也许会使用这种预处理指令来实现:

#define ANIMATION_DURATION 0.3
static const NSTimeInterval kAnimationDuration = 0.3;
// EOCAnimatedView.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface EOCAnimatedView : UIView

- (void)animate;

@end

NS_ASSUME_NONNULL_END

// EOCAnimatedView.m
#import "EOCAnimatedView.h"

static const NSTimeInterval kAnimationDuration = 0.3;

@implementation EOCAnimatedView

- (void)animate {
  [UIView animateWithDuration:kAnimationDuration animations:^{
      // do something
  }];
}

@end

所以kAnimationDuration变量的作用域,只在EOCAnimatedView.m中。

duplicate symbol '_kAnimationDuration' in:
ViewController.o
EOCAnimatedView.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以,同时使用staticconst声明一个变量,不会创建外部符号,也保证了变量不可以被修改,还包好了类型信息,好处非常多的。

上一篇下一篇

猜你喜欢

热点阅读