Sri*_*iMa 8 objective-c optional-parameters objective-c-runtime ios swift
我在Objective-C和Objective-C运行时暴露了swift API.
当我在函数抛出错误之前添加"@objc"时"无法将方法标记为@objc,因为其结果类型无法在Objective-C中表示"
我的代码在这里
@objc public static func logIn(_ userId: String) -> User? { }
Run Code Online (Sandbox Code Playgroud)
用户是可选的结构.怎么解决这个问题.
信息的关键是:
用户是可选结构
如果User是struct,则无法在Objective-C中表示,就像不继承自的Swift类一样NSObject。
为了logIn(_:)能够标记@objc该方法,则方法声明中引用的每个类型都必须在Objective-C中可表示。您收到错误消息,因为User不是。
要解决此问题,您要么必须更改此声明User:
struct User {
// ...
}
Run Code Online (Sandbox Code Playgroud)
...对此:
class User: NSObject {
// ...
}
Run Code Online (Sandbox Code Playgroud)
...或重新设计logIn(_:),使其不返回User。
您可以在此处找到有关此信息的更多信息。特别是,此答案提供了以下潜在解决方案:
我发现最好的东西是包装在Box类中
Run Code Online (Sandbox Code Playgroud)public class Box<T>: NSObject { let unbox: T init(_ value: T) { self.unbox = value } }
NSObject您的类或协议必须由其层次结构中的任何其他类继承(扩展) ,其中包含带@objc符号的代码(函数)。
例子:
class TestClass {
public static func logIn(_ userId: String) -> User? { }
}
Run Code Online (Sandbox Code Playgroud)
要使用/声明@objc此函数,类必须扩展NSObject(或其层次结构中的任何其他类)
class TestClass {
@objc public static func logIn(_ userId: String) -> User? { }
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
这是编辑器的快照
| 归档时间: |
|
| 查看次数: |
9250 次 |
| 最近记录: |