Вызов метода в быстром расширении UIImageView из файла Objective C - PullRequest
0 голосов
/ 04 декабря 2018

Я могу вызывать расширения UIImage в файле Swift из файла Objective-C.

Но по какой-то причине я не могу вызвать следующий метод для расширения 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 ]

0 голосов
/ 04 декабря 2018

Необходимо исправить как минимум три вещи.

В файл 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
}
0 голосов
/ 04 декабря 2018

Расширение не отображается, поскольку в Objective-C не существует опций Swift.Кроме того, поскольку CGRect является структурным типом, а не типом объекта, он не может быть представлен как nil в Objective-C.

Изменение вашего метода на что-то вроде этого было бы одним из возможных решенийВаша проблема:

extension UIImageView {

    @objc
    func getScaledImageSize() -> CGRect {

        // ...

        return .zero;
    }
}

Обратите внимание, что необходимо пометить метод с помощью @objc, чтобы правильно выставить его Objective-C.

Из Swift 4.2 Language Guide :

Концепции опциональных возможностей не существует ни в C, ни в Objective-C.Ближайшая вещь в Objective-C - это возможность вернуть nil из метода, который в противном случае возвратил бы объект, при этом nil означает «отсутствие действительного объекта». Однако это работает только для объектов - это не работает для структур, базовые типы C или значения перечисления.Для этих типов методы Objective C обычно возвращают специальное значение (такое как NSNotFound), чтобы указать на отсутствие значения.Этот подход предполагает, что вызывающий метод знает, что есть специальное значение для проверки, и не забывает проверять его.Опции Swift позволяют вам указать отсутствие значения для любого типа вообще без необходимости использования специальных констант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...