Objective-C在swift类上请求alloc

T. *_*sen 22 objective-c alloc swift

一些小步骤开始围绕Swift缠头.我基本上移植了一个旧类,它只是找到一个名称的匹配图标并返回相应的UIImage.事情的Swift部分似乎正在运行,看起来(几乎)像这样:

@objc class ImageHandler{

    func iconForData(data: MyData) -> UIImage{
        let imagesAndNames = [
            "1": "tree.png",
            "2": "car.png",
            "3": "house.png",
            "7": "boat.png",
        ]

        var imageName: String? = imagesAndNames[data.imageName]
        if !imageName{
            imageName = "placeholder.png"
        }
        let icon = UIImage(named: imageName)
        return icon
    }
}
Run Code Online (Sandbox Code Playgroud)

上面没有任何警告.然而,我的旧Objective-C类要求在swift类上使用alloc方法.

ImageHandler *imageHandler = [ImageHandler alloc] init];
Run Code Online (Sandbox Code Playgroud)

返回错误"没有选择器'alloc'的已知类方法,我猜这是真的,但是如何逃避这个?我是否必须以我的swift-class NSObject为基础来避免这种情况?

aka*_*kyy 48

您将ImageHandler类声明为根类.它本身没有alloc方法.你需要继承NSObject:

@objc class ImageHandler : NSObject {

    ...

}
Run Code Online (Sandbox Code Playgroud)

这个ADF线程中引用.


Log*_*gan 24

只是想在这里评论一下,如果你不想要子类NSObject或任何其他ObjC对象,你可以声明一个类级初始化器:

@objc class ImageHandler{

    class func newInstance() -> ImageHandler {
        return ImageHandler()
    }

    func iconForData(data: MyData) -> UIImage{
        let imagesAndNames = [
            "1": "tree.png",
            "2": "car.png",
            "3": "house.png",
            "7": "boat.png",
        ]

        var imageName: String? = imagesAndNames[data.imageName]
        if !imageName{
            imageName = "placeholder.png"
        }
        let icon = UIImage(named: imageName)
        return icon
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在ObjC

ImageHandler * imageHandler = [ImageHandler newInstance];
Run Code Online (Sandbox Code Playgroud)

这样,除非您愿意,否则不必依赖ObjC类继承.

  • 那么默认情况下编译器真的不会给你任何类级实例化吗?我本以为添加@objc至少会给我一些东西,所以我不必每次都写自己的实例化器. (3认同)