方法不能标记为@objc,因为其结果类型无法在Objective-C中表示

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)

用户是可选的结构.怎么解决这个问题.

Sør*_*sen 5

信息的关键是:

用户是可选结构

如果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类中

public class Box<T>: NSObject {
    let unbox: T
    init(_ value: T) {
        self.unbox = value
    }
}
Run Code Online (Sandbox Code Playgroud)


Kru*_*nal 0

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从更改structclass

尝试以下代码并查看:

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)

这是编辑器的快照

在此输入图像描述