Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C文件UIImageView的Swift扩展名中的调用方法_Ios_Objective C_Swift_Extension Methods - Fatal编程技术网

Ios Objective-C文件UIImageView的Swift扩展名中的调用方法

Ios Objective-C文件UIImageView的Swift扩展名中的调用方法,ios,objective-c,swift,extension-methods,Ios,Objective C,Swift,Extension Methods,我能够从Objective-C文件调用Swift文件中UIImage的扩展名 但由于某些原因,我无法对UIImageView的扩展调用以下方法。UIImageView是否存在一些问题,语法是否已关闭,或者可能有什么问题 extension UIImageView { /// Retrieve the scaled size of the image within this ImageView. /// - Returns: A CGRect representing the si

我能够从Objective-C文件调用Swift文件中UIImage的扩展名

但由于某些原因,我无法对UIImageView的扩展调用以下方法。UIImageView是否存在一些问题,语法是否已关闭,或者可能有什么问题

extension UIImageView {
    /// Retrieve the scaled size of the image within this ImageView.
    /// - Returns: A CGRect representing the size of the image after scaling or nil if no image is set.
    func getScaledImageSize() -> CGRect? {
        if let image = self.image {
            return AVMakeRect(aspectRatio: image.size, insideRect: self.frame);
        }

        return nil;
    }
}
Objective-C文件中的代码:

 CGRect myRect = [self.imageView getScaledImageSize];

给出“UIImageView无可见接口声明选择器getScaledImageSize”错误

扩展不可见,因为Objective-C中不存在Swift选项。此外,由于
cRect
是结构类型而不是对象类型,因此在Objective-C中不能将其表示为
nil

将您的方法更改为类似的方法将是解决您的问题的一个潜在解决方案:

extension UIImageView {

    @objc
    func getScaledImageSize() -> CGRect {

        // ...

        return .zero;
    }
}
请注意,您需要使用
@objc
对该方法进行注释,以便将其正确地公开给Objective-C

从:

optionals的概念在C或Objective-C中不存在。Objective-C中最接近的东西是能够从一个方法返回nil,否则该方法将返回一个对象,nil表示“没有有效对象”。然而,这只适用于对象,而不适用于结构、基本C类型或枚举值。对于这些类型,Objective-C方法通常会返回一个特殊的值(如NSNotFound),以指示没有值。这种方法假设方法的调用者知道有一个特殊的值要测试,并记得检查它。Swift的选项允许您指示任何类型都没有值,而不需要特殊常量


至少有三件事需要解决

在Objective-C文件中,需要添加以下
import
语句:

#import "ProductModuleName-Swift.h"
其中“ProductModuleName”是项目的名称

您需要将
@objc
属性添加到扩展类中:

@objc extension UIImageView
您需要更改方法以返回非可选值。以下是建议的实施方案:

func getScaledImageSize() -> CGRect {
    if let image = self.image {
        return AVMakeRect(aspectRatio: image.size, insideRect: self.frame)
    }

    return CGRect.zero
}

为什么在结尾处有和?这是我尝试过的一个变体,也不起作用。我已经换回来了。