我正在尝试通过观看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()
}
}
答案 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)
您同时需要三件事。让我们拆分它们:
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
if let
在Objective-C中也是可能的,因此它不能与先前的东西结合使用。最简单的方法是:for(NSArray *array = [self getItems]; array != nil; array = nil) { ... }
,但是如果要使用else
分支,它会变得更加复杂。我为此制作了SwiftyObjC吊舱,请看看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