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

时间:2018-03-29 09:29:49

标签: ios objective-c swift optional-parameters objective-c-runtime

暴露了Objective-C和Objective-C运行时中的swift API。

当我添加" @ objc"函数抛出错误之前"方法无法标记为@objc,因为其结果类型无法在Objective-C"

中表示

我的代码在这里

@objc public static func logIn(_ userId: String) -> User? { }

用户是可选的结构。如何解决这个问题。

4 个答案:

答案 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中的可选值,作为解决方法,您应该将Userstruct更改为class

请尝试以下代码并查看:

public class User : NSObject {
    // Your code
}

public final class Manager : NSObject {

    @objc public static func logIn(_ userId: String) -> User? {
        return nil
    }
}

这是带编辑器的快照

enter image description here

答案 3 :(得分:-2)

Objective-C只能看到NSObject派生的类类型。使用:

class User : NSObject {

}