代码之家  ›  专栏  ›  技术社区  ›  user1904273

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

  •  0
  • user1904273  · 技术社区  · 6 年前

    我能够从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”错误

    2 回复  |  直到 6 年前
        1
  •  2
  •   Mike Taverne    6 年前

    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
    }
    
        2
  •  1
  •   ryanecrist    6 年前

    扩展不可见,因为Objective-C中不存在Swift选项。另外,因为 CGRect 是结构类型而不是对象类型,不能表示为 nil

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

    extension UIImageView {
    
        @objc
        func getScaledImageSize() -> CGRect {
    
            // ...
    
            return .zero;
        }
    }
    

    请注意,您需要使用 @objc 将其正确暴露于Objective-C。

    Swift 4.2 Language Guide :

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