暴露了Objective-C和Objective-C运行时中的swift API。
当我添加" @ objc"函数抛出错误之前"方法无法标记为@objc,因为其结果类型无法在Objective-C"
中表示我的代码在这里
@objc public static func logIn(_ userId: String) -> User? { }
用户是可选的结构。如何解决这个问题。
答案 0 :(得分:4)
信息的关键点是:
用户是可选的结构
如果User
是一个结构,那么它就不能用Objective-C表示,就像一个不从NSObject
继承的Swift类一样。
为了能够将方法logIn(_:)
标记为@objc
,方法声明中引用的每个类型都必须在Objective-C中表示。您收到错误消息,因为User
不是。
要修复它,你要么必须改变User
的声明:
struct User {
// ...
}
......对此:
class User: NSObject {
// ...
}
...或重新设计logIn(_:)
,以便它不会返回User
。
您可以找到有关此here的更多信息。特别是,this answer提供了以下潜在解决方案:
我发现的最好的事情是包装在Box类
中public class Box<T>: NSObject { let unbox: T init(_ value: T) { self.unbox = value } }
答案 1 :(得分:2)
更改班级的定义,如下所示
class User: NSObject {
}
通过这种方式,这个类将在Objective-C
中提供答案 2 :(得分:0)
您的类或协议必须由NSObject
或其层次结构中的任何其他类继承(扩展),包含带有@objc
表示法的代码(函数)。
示例:
class TestClass {
public static func logIn(_ userId: String) -> User? { }
}
要对此函数使用/声明@objc
,类必须扩展NSObject
(或其层次结构中的任何其他类)
class TestClass {
@objc public static func logIn(_ userId: String) -> User? { }
}
struct
可能不适用于Objective-C中的可选值,作为解决方法,您应该将User
从struct
更改为class
请尝试以下代码并查看:
public class User : NSObject {
// Your code
}
public final class Manager : NSObject {
@objc public static func logIn(_ userId: String) -> User? {
return nil
}
}
这是带编辑器的快照
答案 3 :(得分:-2)
Objective-C只能看到NSObject派生的类类型。使用:
class User : NSObject {
}