我收到了几个这样的警告:
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
我有一个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) 我有两个 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 。
我想验证用户创建的表达式(如“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
我有一个在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
在 Xcode 10 中运行我的项目会引发此错误
fatal error: 'Stories-Swift.h' file not found
我尝试了多种方法,包括:
Defines Modules为YesSWIFT_OBJC_INTERFACE_HEADER_NAME并将其设置为$(PROJECT_NAME)-Swift.h我检查了我的派生数据,没有 ProjectName-Swift.h 的痕迹。
我是不是错过了一些明显的东西,TIA。
xcode swift objective-c-swift-bridge bridging-header xcode10
我见过很多关于在 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
我按照此处的指南创建了一个涡轮模块。这很好。
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
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项目中编写了一个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)
仍然没有.
swift ×10
objective-c ×6
ios ×3
nsexpression ×1
react-native ×1
struct ×1
swift3 ×1
xcode ×1
xcode10 ×1
xcode6 ×1