GVKun编程网logo

在Swift中使用Objective-C方法似乎跨越了Swift语言的关键字(swift objective-c)

16

在本文中,我们将为您详细介绍在Swift中使用Objective-C方法似乎跨越了Swift语言的关键字的相关知识,并且为您解答关于swiftobjective-c的疑问,此外,我们还会提供一些关于i

在本文中,我们将为您详细介绍在Swift中使用Objective-C方法似乎跨越了Swift语言的关键字的相关知识,并且为您解答关于swift objective-c的疑问,此外,我们还会提供一些关于ios – 在Swift中覆盖Objective C类方法、ios – 如何在Swift中调用Objective-C类别方法、ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?、objective-c – 在Swift中使用Obj-C完成块的有用信息。

本文目录一览:

在Swift中使用Objective-C方法似乎跨越了Swift语言的关键字(swift objective-c)

在Swift中使用Objective-C方法似乎跨越了Swift语言的关键字(swift objective-c)

我有一个objective-c方法:

-(DeviceVar *)var:(NSString*)valid

在Objective-C中,我简单地将其用作:

DeviceVar* rtc = [device var:@"rtc"];

但是我很快就使用这种方法遇到了问题:

let rtc = device.var("etc")

因为var是我猜的关键字,所以我的问题是如何使其工作。

答案1

小编典典

如果需要将保留字用作方法名称,则可以始终将其保留在反引号中:

let rtc = device.`var`("etc")

如果您具有对Objective-C头文件的写访问权,那么另一种选择是为Swift定义一个不同的方法名称(在“将Swift与Cocoa和Objective-
C一起使用”参考中,比较同一项目中的Swift和Objective-C):

-(DeviceVar *)var:(NSString*)valid NS_SWIFT_NAME(deviceVar(_:));

然后可以从Swift调用为

let rtc = device.deviceVar("etc")

ios – 在Swift中覆盖Objective C类方法

ios – 在Swift中覆盖Objective C类方法

我是 Swift的初学者,我正在尝试在Swift项目中使用JSONModel.
我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.

该方法的签名是:

+(JSONKeyMapper*)keyMapper;

我怎样才能做到这一点?

解决方法

您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:
override class func keyMapper() -> JSONKeyMapper! {
    //code here
}

ios – 如何在Swift中调用Objective-C类别方法

ios – 如何在Swift中调用Objective-C类别方法

你如何在 Swift中调用这样的Objective-C类别方法?
+(UIColor*)colorWithHexString:(Nsstring*)hex alpha:(float)alpha;

解决方法

编译器自动查找常见的ObjC命名模式,并在其位置替换Swift模式.一个ObjC类方法返回一个类的实例(并以某种方式命名,看起来像)被转换为Swift便利初始化器.

如果您有ObjC方法(由自定义类别定义):

+ (UIColor *)colorWithHexString:(Nsstring *)hex alpha:(float)alpha;

编译器生成Swift声明:

convenience init(hexString: String?,alpha: CFloat)

你这样称呼它:

let color = UIColor(hexString: "#ffffff",alpha: 1.0)

在Swift 2.0或更高版本中,您可以使用NS_SWIFT_NAME宏将ObjC工厂方法与作为初始化程序的Swift的命名模式导入不匹配.例如.:

@interface UIColor(Hex)
+ (UIColor *)hexColorWithString:(Nsstring *)string
NS_SWIFT_NAME(init(hexString:));
@end

// imports as
extension UIColor {
    init(hexString: String)
}

ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?

ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?

我的项目使用 Swift并针对iOS 8.0及更新版本,但我们使用旧的Objective-C项目中的一些文件,并通过CocoaPods引入一些Objective-C库.我应该在这个项目中使用哪个Realm接口:Objective-C还是Swift?我很困惑因为Realm文档中的公告:

If you’re looking to use Realm from Objective-C,or from mixed Objective-C & Swift apps please see Realm Objective-C instead.
Using both Realm Objective-C and Realm Swift simultaneously is not supported.

解决方法

它们的关键细节是您是打算仅从Swift,还是Swift和Objective-C访问您的Realm模型类.如果您只从Swift访问它们,您可以愉快地使用Realm Swift,即使您的应用程序中的其他地方使用了使用Objective-C编写的代码.如果要从Swift和Objective-C代码访问Realm模型类,则需要使用Realm Objective-C而不是Realm Swift.

objective-c – 在Swift中使用Obj-C完成块

objective-c – 在Swift中使用Obj-C完成块

在Objective-C中,我有一个完成块类定义为:

File.h

typedef void (^MYCompletionBlock)(BOOL success,NSDictionary *result,NSError *error);

然后,在Swift文件中,我尝试使用完成块,如下所示:

Swift.swift

class MyClass: NSObject{
     ...

     func MyFunction() -> Void {
          ...
          objcmethod(param1,withCompletion: {(MYCompletionBlock) -> Void in
               if (success){ // Error:"Use of unresolved identifier 'success'"
               }
          }
          ... 
     }
     ...
}

但是,我一直收到一个错误:“使用未解析的标识符’成功’”.

我也尝试了以下内容:

objcmethod(param1,withCompletion: {(success:Bool,result: NSDictionary,error:NSError) -> Void in
     if (success){ // Error:"Cannot convert value of type '(Bool,NSDictionary,NSError) -> Void' to expected argument type "MYCompletionBlock!" 
     }
}

有人可以帮我理解如何在Swift中正确指定Obj-C完成块吗?

解决方法

鉴于您的闭包没有指定可空性限定符(它们几乎肯定是可选的),可以安全地假设您的Objective-C API未经过可空性审核.因此,Swift会将指针视为隐式解包的选项.此外,现在NSDictionary被映射到[NSObject:AnyObject] Swift字典.

因此,它将是:

obj.objcmethod(param) { (success: Bool,result: [NSObject : AnyObject]!,error: NSError!) in
    if success {
        // do something
    }
}

或者,正如Kobi所指出的,您可以让编译器推断出类型:

obj.objcmethod(param) { success,result,error in
    if success {
        // do something
    }
}

请注意,您不必自己记住这一点.输入代码时,您可以利用Xcode的代码完成.因此,键入足以匹配方法名称以及何时匹配objcmethod,然后按Enter键:

enter image description here

当你到达MYCompletionBlock时,再次按回车键,它会显示正确的签名:

enter image description here

如果这个Objective-C方法是我自己的类,我会审核它的可空性.因此,例如,让我们假设param是可选的,闭包是必需的,结果和错误是可选的,你可以这样定义它:

NS_ASSUME_NONNULL_BEGIN

typedef void (^MYCompletionBlock)(BOOL success,NSDictionary * _Nullable result,NSError * _Nullable error);

@interface MyObject : NSObject

- (void)objcmethod:(NSDictionary * _Nullable)param1 withCompletionHandler:(MYCompletionBlock)completionHandler;

@end

NS_ASSUME_NONNULL_END

而且,如果是这种情况,您的Swift代码会像这样调用它:

obj.objcmethod(param) { (success: Bool,result: [NSObject : AnyObject]?,error: NSError?) in
    if success {
        // do something
    }
}

或者,再次,让编译器为您推断类型(但这次它们被推断为未隐式解包的选项):

obj.objcmethod(param) { success,error in
    if success {
        // do something
    }
}

关于在Swift中使用Objective-C方法似乎跨越了Swift语言的关键字swift objective-c的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ios – 在Swift中覆盖Objective C类方法、ios – 如何在Swift中调用Objective-C类别方法、ios – 我应该在我的混合Objective-C / Swift项目中使用Realm Objective-C或Realm Swift吗?、objective-c – 在Swift中使用Obj-C完成块等相关内容,可以在本站寻找。

本文标签: