• xcode中一些便捷用法@literals简写


    总结一下,新的属性绑定规则如下:

    ●  除非开发者在实现文件中提供getter或setter,否则将自动生成

    ● 除非开发者同时提供getter和setter,否则将自动生成实例变量

    ●  只要写了synthesis,无论有没有跟实例变量名,都将生成实例变量

               ●  如开发者写了@synthesize foo;那么实例变量名就是foo

    ●  dynamic优先级高于synthesis

               ● 对于写了@dynamic的实现,所有的对应的synthesis都将不生效

     

     

     

    @literals(简写)

    在xcode4.4以前

    NSNumber

    所有的[NSNumber numberWith…:]方法都可以简写了:

    int number;

    ●  [NSNumber numberWithInt:number]简写为 @(number);

    ●  [NSNumber numberWithChar:‘X’]简写为 @‘X’;

    ●  [NSNumber numberWithInt:12345] 简写为 @12345

    ●  [NSNumber numberWithUnsignedLong:12345ul] 简写为 @12345ul

    ● [NSNumber numberWithLongLong:12345ll] 简写为 @12345ll

    ●  [NSNumber numberWithFloat:123.45f] 简写为 @123.45f

    ●  [NSNumber numberWithDouble:123.45] 简写为 @123.45

    ●  [NSNumber numberWithBool:YES] 简写为 @YES

     

    NSDictionary

    ●  [NSDictionary dictionary] 简写为 @{}

    ●  [NSDictionary dictionaryWithObject:o1forKey:k1] 简写为 @{ k1 : o1 }

    ●  [NSDictionarydictionaryWithObjectsAndKeys:o1, k1, o2, k2, o3, k3, nil] 简写为 @{ k1 : o1, k2 : o2, k3 : o3 }

     

     

    当写下@{ k1 : o1, k2 : o2, k3 : o3 }时,实际的代码会是

    // compiler generates:

    id objects[] = { o1, o2, o3 };

    id keys[] = { k1, k2, k3 };

    NSUInteger count = sizeof(objects) / sizeof(id);

    dict = [NSDictionary dictionaryWithObjects:objects forKeys:keyscount:count];

     

    NSArray

    部分NSArray方法得到了简化:

    ● [NSArray array] 简写为 @[]

    ●  [NSArray arrayWithObject:a] 简写为 @[ a ]

    ●  [NSArray arrayWithObjects:a, b, c, nil] 简写为 @[ a, b, c ]

     

     

    比如对于@[ a, b, c ],实际编译时的代码是

    // compiler generates:

    id objects[] = { a, b, c };

    NSUInteger count = sizeof(objects)/ sizeof(id);

    array = [NSArray arrayWithObjects:objectscount:count];

     

    Mutable版本和静态版本
    上面所生成的版本都是不可变的,想得到可变版本的话,可以对其发送-mutableCopy消息以生成一份可变的拷贝。比如

    NSMutableArray *mutablePlanets = [@[
    @"Mercury", @"Venus",
    @"Earth", @"Mars",
    @"Jupiter", @"Saturn",
    @"Uranus", @"Neptune" ]
    mutableCopy];

    另外,对于标记为static的数组,不能使用简写为其赋值(其实原来的传统写法也不行)。

    如果直接赋值就会提示出错

     

    @implementation MyClass

    static NSArray *  thePlanets = @[                                            error:array literals not constant

    @"Mercury", @"Venus", @"Earth",

    @"Mars", @"Jupiter", @"Saturn",

    @"Uranus", @"Neptune"

    ];

    解决方法是在类方法+ (void)initialize中对static进行赋值。

     

    @implementation MyClass

    static NSArray *thePlanets;

    + (void)initialize{

    if (self == [MyClass class]) {

    thePlanets = @[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune" ];

    }

    }

    下标

    Array

     

        Song *oldSong = [_songs objectAtIndex:idx];

    [_songs replaceObjectAtIndex:idx withObject:newSong];

    可以简写为

    Song *oldSong = _songs[idx];

    _songs[idx] = newSong;

    Dictionary

    id oldObject = [_storage objectForKey:key];

    [_storage setObject:newobject forKey:key];

    可以简写为

    id oldObject = _storage[key];

    _storage[key] = newObject;

    而且你不仅仅能使用它所提供的下标访问。你也可以对自定义的类使用下标访问。

    对于我们自定义的类,只需要实现一下的方法就能使用下标访问。

    Array

    - (elementType)objectAtIndexedSubscript:(indexType)idx;

    - (void)setObject:(elementType)object atIndexedSubscript:(indexType)idx;

    Dictionary

    - (elementType)objectForKeyedSubscript:(keyType)key;

    - (void)setObject:(elementType)object forKeyedSubscript:(keyType)key;

  • 相关阅读:
    EventBus
    Date 时间 日期 常用方法函数
    线程 Thread Handler
    MySQL-DoubleWrite
    MySQL各版本优化器变化
    MySQL优化器-条件过滤(condition_fanout_filter)
    PXC集群搭建
    mysql主从不一致--relay_log_recovery设置成0
    MySQL5.7-sql_mode
    根据ibd文件进行数据恢复或导入
  • 原文地址:https://www.cnblogs.com/Cristen/p/3524223.html
Copyright © 2020-2023  润新知