标签: objective-c-swift-bridge

将项目移动到快速桥接项目后,"LOG_INFO"宏重新定义了警告

我收到了几个这样的警告:

Swift compiler warning:
CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler

/Myfolder/Pods/Headers/CocoaLumberjack/DDLog.h:176:9: 'LOG_INFO' macro redefined
/Myfolder/Pods/Headers/CocoaLumberjack/DDLog.h:177:9: 'LOG_DEBUG' macro redefined
Run Code Online (Sandbox Code Playgroud)

警告在Projet-Bridging-Header.h中抱怨DDLog.h

#import "DDLog.h"
#import "DDASLLogger.h"
#import "DDTTYLogger.h"
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

objective-c swift xcode6 objective-c-swift-bridge cocoalumberjack

5
推荐指数
1
解决办法
1113
查看次数

是否可以将“ AnyObject”强制转换为快速结构

我有一个swift方法接收结构作为参数。由于未将结构桥接到Objective-C,因此此方法在桥接标头中不可见。
我被迫创建一个新的“完全相同”的方法,该方法接收“ AnyObject”而不是结构所要求的原始方法。

现在,我负责从“ AnyObject” 实例化swift结构。是否可以“投射”“AnyObject在这种情况下, ”转换为快速结构?

我是否被迫编写样板文件以从中构造一个快速结构 AnyObject

我可以寄一个 NSDictionary表示结构的键/值对。这有什么帮助吗?

例如 :

迅速

struct Properties {
  var color = UIColor.redColor()
  var text = "Some text" 
}

class SomeClass : UIViewController {
  func configure(options : Properties) {
    // the original method 
    // not visible from 
  }
  func wrapObjC_Configure(options : AnyObject) {
    // Visible to objective-c
    var convertedStruct = (options as Properties) // cast to the swift struct
    self.configure(convertedStruct)
  }
}
Run Code Online (Sandbox Code Playgroud)

目标c

SomeClass *obj = …
Run Code Online (Sandbox Code Playgroud)

struct objective-c ios swift objective-c-swift-bridge

5
推荐指数
1
解决办法
3725
查看次数

NS_SWIFT_NAME 用于将 C 函数作为类扩展导入

我有两个 C 函数:

extern UIColor* LNRandomDarkColor();
extern UIColor* LNRandomLightColor();
Run Code Online (Sandbox Code Playgroud)

作为练习,我尝试将它们作为UIColor.

以下为 WWDC 2016 中 Apple 的“Swift 新增功能”演示示例:

void CGContextFillPath(CGContextRef) NS_SWIFT_NAME(CGContext.fillPath(self:)); 
Run Code Online (Sandbox Code Playgroud)

我尝试类似地注释我的函数:

extern UIColor* LNRandomDarkColor() NS_SWIFT_NAME(UIColor.randomDarkColor());
extern UIColor* LNRandomLightColor() NS_SWIFT_NAME(UIColor.randomLightColor());
Run Code Online (Sandbox Code Playgroud)

但是我收到以下警告:

'swift_name' 属性只能应用于带有原型的函数声明

我在这里做错了什么?


更新:为此问题打开SR-2999 。

swift objective-c-swift-bridge swift3

5
推荐指数
1
解决办法
3427
查看次数

使用 NSExpression 时捕获 NSInvalidArgumentException 的正确方法

我想验证用户创建的表达式(如“2+2”、“5+7”或更复杂的)。我使用 NSExpression 类来解析和计算这个表达式。这是我的游乐场代码:

import UIKit

let string = "2+2"

var ex:NSExpression?
do {
    ex = NSExpression(format: string)
}
catch {
    print("String is not valid expression")
}

if let result = ex?.expressionValue(with: nil, context: nil) as! NSNumber? {
    print("result is \(result)")
}
Run Code Online (Sandbox Code Playgroud)

当我使用有效表达式(“2+2”)时 - 我得到了结果。但有时用户可能会提供错误的字符串(例如“2+”)。有了这个字符串,我的应用程序崩溃了:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "2+ == 1"'
Run Code Online (Sandbox Code Playgroud)

我不明白我如何捕捉这个异常以及为什么上面的代码不这样做。现在我使用 Objective C 类(具有相同的逻辑),从我的 swift 代码中调用这个方法,在那个类中我真的可以捕获这样的异常:

+(NSNumber *)solveExpression:(NSString *)string
{
    id value;
    @try {
        NSExpression *ex = [NSExpression …
Run Code Online (Sandbox Code Playgroud)

exception-handling nsexpression swift objective-c-swift-bridge

5
推荐指数
1
解决办法
3375
查看次数

如何将Objective-C initWithError:方法桥接到Swift中

我有一个在Objective-C中定义的类,其初始化程序是-initWithError:(初始化程序可能由于依赖外部资源而失败).我希望这能成为Swift的桥梁init() throws.从NSObject继承的常规初始化程序-init可以标记为不可用,因为我不希望它被使用.

在Objective-C中,我有:

@interface Foo : NSObject

- (instancetype _Nullable)initWithError:(NSError **)error;

@end
Run Code Online (Sandbox Code Playgroud)

当然,这在Objective-C中工作正常.

在Swift中,-initWithError被桥接为init(error: ()) throws.这可能是因为withError:从方法名称中删除会导致init()与继承的普通-init初始化程序发生冲突.这可以从Swift调用,如下所示:

let foo = try Foo(error: ())
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,因为error参数是无效的.如果将其作为进口进口肯定会更好init() throws.显而易见的解决方案是在Objective-C标头中标记-init使用NS_UNAVAILABLE.不幸的是,这不起作用.-initWithError:仍然被桥接init(error: ()),并试图try Foo()在编译器错误中调用结果,说明init()在Swift中不可用.

是否有一个更优雅的解决方案,这样try init()才有效?

initialization objective-c ios swift objective-c-swift-bridge

5
推荐指数
1
解决办法
217
查看次数

项目名称-Swift.h 未找到/生成 Xcode 10

在 Xcode 10 中运行我的项目会引发此错误

fatal error: 'Stories-Swift.h' file not found

我尝试了多种方法,包括:

  • 向项目添加一个新的 swift 文件并重建它
  • 设置Defines ModulesYes
  • 仔细检查我的SWIFT_OBJC_INTERFACE_HEADER_NAME并将其设置为$(PROJECT_NAME)-Swift.h

我检查了我的派生数据,没有 ProjectName-Swift.h 的痕迹。

我是不是错过了一些明显的东西,TIA。

xcode swift objective-c-swift-bridge bridging-header xcode10

5
推荐指数
1
解决办法
3598
查看次数

从另一个 Swift 类访问 Obj-C 类中实现的 Swift 协议属性

我见过很多关于在 Swift 中实现 Obj-C 协议的问题,但反之则不然,而且我还没有具体看到这一点。

我正在使用混合 Obj-C / Swift 代码库。我有一个 Swift 协议定义如下:

命名项目.swift

@objc protocol NamedItem {
    var name: String { get }
}
Run Code Online (Sandbox Code Playgroud)

我有一个现有的 Objective-C 类,它目前拥有自己的name属性:

MyObjcClass.h

@interface MyObjcClass : NSObject
@property (nonatomic, strong, readonly) NSString* name;
@end
Run Code Online (Sandbox Code Playgroud)

我还有其他几个具有name属性的类,因此显然我想将它们全部与协议关联起来,而不是类型转换为一堆不同的类型。现在,如果我尝试将 Obj-C 类从拥有自己的属性切换为实现 Swift 协议:

MyObjcClass.h

@protocol MyObjcProtocol
@property (nonatomic, strong, readonly) NSString* place;
@end

@interface MyObjcClass : NSObject
@end
Run Code Online (Sandbox Code Playgroud)

MyObjcClass.m

@interface MyObjcClass () <NamedItem>
@end

@implementation MyObjcClass
@synthesize name = _name;
@synthesize place = _place;
@end …
Run Code Online (Sandbox Code Playgroud)

compiler-errors objective-c swift objective-c-swift-bridge swift-protocols

5
推荐指数
1
解决办法
1259
查看次数

如何在 React Native Turbo 模块中使用 Swift

我按照此处的指南创建了一个涡轮模块。这很好。

https://reactnative.dev/docs/the-new-architecture/pillars-turbomodules

我想在这个 Turbo 模块中使用 Swift 代码。我尝试使用此代码添加一个 Swift 文件并修改 ,RTNCalculator.mm以便在从 Objective-C 调用的 Swift 中进行数字添加。

SwiftCalculator.swift

import Foundation

@objc class SwiftCalculator: NSObject {
    @objc func add(a: Double, b: Double) -> Double {
        return a + b
    }
}
Run Code Online (Sandbox Code Playgroud)

RTN计算器.mm

#import "RTNCalculatorSpec.h"
#import "RTNCalculator.h"
#import "RTNCalculator-Swift.h"

@implementation RTNCalculator

RCT_EXPORT_MODULE()

- (void)add:(double)a b:(double)b resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
    SwiftCalculator *calculator = [SwiftCalculator new];
    double value = [calculator addWithA:a b:b];
    NSNumber *result = [[NSNumber alloc] initWithDouble:value];
    resolve(result);
}

- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
    (const facebook::react::ObjCTurboModule::InitParams &)params
{ …
Run Code Online (Sandbox Code Playgroud)

objective-c swift objective-c-swift-bridge react-native react-native-turbomodule

5
推荐指数
1
解决办法
729
查看次数

Objective-C调用Swift函数

MySwift.swift文件中定义的Swift函数:

func SomeSwift()
{

}
Run Code Online (Sandbox Code Playgroud)

SomeSwift() 在任何Swift类中都没有定义,它只是一个纯函数.

CMD+ 之后B构建项目,打开Project-Swift.h,SomeSwift()那里没有显示.

是否必须在某些Swift类中定义Swift中的函数?并@objc标有?

如下:

@objc class SomeSwift: NSObject {
   func SomeSwift()
  {

  }
}
Run Code Online (Sandbox Code Playgroud)

objective-c ios swift objective-c-swift-bridge

4
推荐指数
1
解决办法
2017
查看次数

使用Swift文件的NSClassFromString

我在现有的Objective-C项目中编写了一个Swift类.到目前为止,桥接工作非常顺利.我确实有一个方法,我在运行时使用NSClassFromString()生成一个类.当字符串是我的Swift类名时,它返回nil.

class MySwiftClass : NSObject {}
Run Code Online (Sandbox Code Playgroud)

在Objective-C中:

Class myClass = NSClassFromString(@"MySwiftClass");
Run Code Online (Sandbox Code Playgroud)

而myClass每次都是零.我也尝试过:

Class myClass = NSClassFromString(@"MyAppName.MySwiftClass");
Run Code Online (Sandbox Code Playgroud)

仍然没有.

objective-c-runtime swift objective-c-swift-bridge

3
推荐指数
1
解决办法
1515
查看次数