j9九游会登陆--首页直达

Swift 3.0 令人愉快,但Objective-C也有小改良--Objec
  • 智网科技
  • ###
  • 分类: 智网新闻
  • 阅读量: 154

1-50DxWpZ12uwMpmIu-d0cpw.jpeg


由于Swift 3.0 出了太多令人愉快的新特征,人们很容易疏忽 Objective-C中的小窜改。大概你会以为苹果提及Objective-C 很大概是为了进步和Swift互操纵性(译者注:互操纵性次要是指OC代码与Swift代码互相转换),不外苹果仍旧很接待开辟者用Objective-C来完成事情。

在这篇文章中,j9九游会就来看看Objective-C中新添加的类属性。
Objective-C 类属性
摘自 Xcode 8正式版中的阐明:
Objective-C now supports class properties, which interoperate with Swift type properties. 
They are declared as: @property (class) NSString *someStringProperty;. 
They are never synthesized. (23891898)
翻译如下:

Objective-C 如今支持类属性了,与OC 中的类属性对应的是Swift的范例属性。
它们是如许声明的:@property (class) NSString *someStringProperty;
类属性永久不会被主动分解。
为了理论一下,j9九游会来创立一个包括几个范例的复杂 Objective-C 类。这是j9九游会的 `User`类接口,它看起来是如许的:

1
2
3
4
5
@interface User : NSObject
@property (class, nonatomic, assign, readonly) NSInteger userCount;
@property (class, nonatomic, copy) NSUUID *identifier;
+ (void)resetIdentifier;
@end

上面来阐明一下j9九游会这两个类属性,第一个是只读的integer范例,第二个是可读可写具有copy特征的NSUUID范例。要留意有属性声明的类。
完成也很复杂,j9九游会起首必要存储 `identifier` 和 `userCount` 类属性。由于它们是类级另外也不是实例变量,因而j9九游会把他们声明为静态的:

1
2
3
@implementation User
static NSUUID *_identifier = nil;
static NSInteger _userCount = 0;

如今j9九游会必需为这两个属性创立 `getter` 和 `setter` 办法。在正式版阐明里曾经提到过,这些类属性永久不会被分解,以是假如 短少 `getter` 或 `setter`,Xcode 将会报告诫。第一个只读的`userCount`仅必要一个前往count 值的 getter 办法。 留意利用 `+`使j9九游会的getter 办法酿成一个类办法:

1
2
3
+ (NSInteger)userCount {
  return _userCount;
}

`identifier` 属性则 getter办法 和 setter 办法都必要。在getter 办法中,假如identifier为空,j9九游会就新建一个identifier:

1
2
3
4
5
6
7
8
9
10
11
12
+ (NSUUID *)identifier {
  if (_identifier == nil) {
    _identifier = [[NSUUID alloc] init];
  }
  return _identifier;
}
 
+ (void)setIdentifier:(NSUUID *)newIdentifier {
  if (newIdentifier != _identifier) {
    _identifier = [newIdentifier copy];
  }
}

j9九游会也为这个`User`类创立了一个会更新 count 属性的根本初始化办法。

1
2
3
4
5
6
7
8
- (instancetype)init
{
  self = [super init];
  if (self) {
    _userCount += 1;
  }
  return self;
}

`resetIdentifier`类办法 是一个能创立一个新的identifier 的便当办法:

1
2
3
4
5
+ (void)resetIdentifier {
  _identifier = [[NSUUID alloc] init];
}
 
@end

j9九游会可以在类名后利用点语法来获取到类属性:
User.userCount;
User.identifier;
这里有一个关于User类用法的例子:

1
2
3
4
5
6
7
8
for (int i = 0; i < 3; i++) {
    self.user = [[User alloc] init];
    NSLog(@"User count: %ld",(long)User.userCount);
    NSLog(@"Identifier = %@",User.identifier);
}
 
[User resetIdentifier];    
NSLog(@"Identifier = %@",User.identifier);

这是输入:

1
2
3
4
5
6
7
// User count: 1
// Identifier = 4B98B7FD-F8DC-484A-92B2-B2BB20BCB709
// User count: 2
// Identifier = 4B98B7FD-F8DC-484A-92B2-B2BB20BCB709
// User count: 3
// Identifier = 4B98B7FD-F8DC-484A-92B2-B2BB20BCB709
// Identifier = A0519681-1E08-4DF2-B2D1-D077CF2BDEFF

留意:只管这是Xcode 8 中 LLVM 编译器的新特征,但它关于iOS 10之前的版本仍然实用。
天生的Swift接口
好像,Objective-C 近来的这些改良只是为了进步与Swift的互操纵性。Objective-C中新添加的范例属性对应的是Swift中类变量的用法。上面这是j9九游会 `User`类转换为 Swift 后的样子:

1
2
3
4
5
public class User : NSObject { 
  public class var userCount: Int { get }
  public class var identifier: UUID!   
  public class func resetIdentifier()
}

留意,identifier 类属性是一个会隐式解包的变量,意味着j9九游会永久也不盼望它为nil。为了容许它为nil,j9九游会必要在Objective-C的属性声明里添加一个 `nullable`的标识。 j9九游会的Swift 变量也将会是可选范例的。看 [Using nullable to annotate Objective-C]可以看到更多细致内容。
拓展阅读