Swift在Objective C中的“if let”等价物

时间:2016-01-09 04:55:22

标签: objective-c swift

我正在尝试通过观看Swift的教程来学习Objective C.在我学习的过程中,我尝试尽可能多地将swift的代码转换为Objective C。最近我偶然发现了“if let”结构。我无法转换为Objective C.我想知道它的Objective C等价物。我想要转换为Objective C的示例代码如下;

if let pfobjects = images as? [PFObject] {
    if pfobjects.count > 0 {
        var imageView: PFImageView = PFImageView()
        imageView.file = pfobjects[0] as! PFFile
        imageView.loadInBackground()
    }
}

5 个答案:

答案 0 :(得分:6)

在Objective-C中没有直接等同于if let,因为if let执行特定于Swift的事物(解包选项和重新绑定标识符),它们在Objective-C中没有直接等价物。

这几乎相当于你的Swift代码:

if (images != nil) {
    NSArray<PFObject *> *pfobjects = (id)images;
    if (pfobjects.count > 0) {
        PFImageView *imageView = [[PFImageView alloc] init];
        assert([pfobjects[0] isKindOfClass:[PFFile class]]);
        imageView.file = (PFFile *)pfobjects[0];
        [imageView loadInBackground];
    }
}

但是这个Objective-C代码不会验证images只包含PFObject的实例,并且只要pfobjects[0]PFFile就应该成功创建图像视图}。如果images包含任何非PFObject元素,则您的Swift代码将不执行任何操作(不创建图像视图)。

答案 1 :(得分:1)

您可以使用NSPredicate验证数组是否仅包含PFObject的实例:

NSPredicate *p = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [PFObject class]];
NSInteger numberThatArePFObjects = [images filteredArrayUsingPredicate:p].count;
if(numberThatArePFObjects && numberThatArePFObjects == images.count){
    // certain that images only contains instances of PFObject.
}

但是,如果您不使用数组而只使用单个对象,则更简单:

if([image isKindOfClass:[PFObject class]]){
    // certain that image is a valid PFObject.
}

或者如果您想要一个新变量:

PFObject* obj = nil;
if([image isKindOfClass:[PFObject class]] && (obj = image)){
    // certain that obj is a valid PFObject.
}

答案 2 :(得分:0)

您可以使用以下内容:

NSArray<PFObject *> *pfobjects;
if ([images isKindOfClass: [NSArray<PFObject> class]] && (pfobjects = images)) {
    // your code here
}

答案 3 :(得分:0)

您同时需要三件事。让我们拆分它们:

  1. variable as? OtherType是可能的,但会删除类型,因为它返回id。实现就像NSObject类中的类别一样容易,因此它变成NSArray *array = [jsonDict[@"objects"] ifKindOfClass:NSArray.class]

实施

@interface NSObject (OptionalDowncast)
- (id)ifKindOfClass:(__unsafe_unretained Class)clazz;
@end
@implementation NSObject (OptionalDowncast)
- (id)ifKindOfClass:(__unsafe_unretained Class)clazz {
    return [self isKindOfClass:clazz] ? self : nil;
}
@end
    如果类型是已知的,则
  1. if let在Objective-C中也是可能的,因此它不能与先前的东西结合使用。最简单的方法是:for(NSArray *array = [self getItems]; array != nil; array = nil) { ... },但是如果要使用else分支,它会变得更加复杂。我为此制作了SwiftyObjC吊舱,请看看
  2. 在Objective-C进行类型转换期间无法检查通用模板,因此可以转换为NSArray,但不能转换为NSArray<PFObject>

我看不到数组的迭代:话虽如此,我认为最好的例子是(假设图像已经是数组):

for(PFFile *file = [images.firstObject ifKindOfClass:PFFile.class]; file != nil; file = nil) {
  imageView.file = file;
  [imageView loadInBackground];
}

如果您还需要对其进行迭代:

for(id object in images) {
  for(PFFile *file = [object ifKindOfClass:PFFile.class]; file != nil; file = nil) {
     //operate on file
  }
} 

答案 4 :(得分:-3)

您可以使用Objective-C ++代替Objective-C。在这里你可以使用下一个定义:

#define let const auto

注意:它不完全相同(Swift包装了值,......)但它使工作更容易。

通过这个定义你可以这样使用它:

if (let pfobjects = images) {
    if (pfobjects.count > 0 {
        let imageView = [[PFImageView alloc] init];
        imageView.file = pfobjects[0];
        imageView loadInBackground();
    }
}

要在Objective-C ++类中转换Objective-C类,您只需将.m的实现文件的扩展名更改为.mm