Библиотека Swift CocoaPods в объективном проекте C - PullRequest
1 голос
/ 30 января 2020

Я нашел несколько онлайн-ресурсов о том, как включить библиотеку Objective- C в проект Swift, и несколько ограниченных ресурсов о том, как сделать обратное (именно это я и хочу).

Мне удалось заставить мой проект компилироваться и запускаться на основе работы, которую я сделал здесь в этом вопросе: Библиотека Swift CocoaPod в Objective- C Миграция проекта из Swift 3 в 4/5

Однако всякий раз, когда я пытаюсь получить доступ к чему-либо из библиотеки Swift в моем проекте Obj C, мое приложение вылетает со следующим ...

2020-01-29 14:42:09.756352-0700 Hyperion[13547:2723315] -[HGCircularSlider.RangeCircularSlider setStartPointValue:]: unrecognized selector sent to instance 0x1074088c0
2020-01-29 14:42:09.763045-0700 Hyperion[13547:2723315] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[HGCircularSlider.RangeCircularSlider setStartPointValue:]: unrecognized selector sent to instance 0x1074088c0'
*** First throw call stack:
(0x18e32ea48 0x18e055fa4 0x18e2325a8 0x1923cf86c 0x18e332af4 0x18e334a7c 0x10208f554 0x10208d4d4 0x192d15dec 0x192be580c 0x10208d388 0x10208b570 0x191d8cab8 0x191d8d160 0x191d11b40 0x191d11c6c 0x191d192c0 0x191d23b84 0x191d23f70 0x191d1716c 0x191d119a0 0x191d87134 0x191d87838 0x1924f3d74 0x1924f7224 0x1924f70d0 0x1924f739c 0x191d87290 0x191d87838 0x1924f3d74 0x1924f7224 0x1924f70d0 0x1924f739c 0x191d87290 0x191d87838 0x191cceaec 0x191ccdf08 0x191cca9c8 0x191cca7e0 0x191ccde54 0x1923a2e50 0x191b3e148 0x1923a2e50 0x191dd9494 0x191dd97f8 0x191b40b58 0x1923a2e50 0x191dd9494 0x191dd97f8 0x191dd8814 0x1923dc3d4 0x1923dd714 0x1923b9e2c 0x192431fa4 0x192434500 0x19242d374 0x18e2aca00 0x18e2ac958 0x18e2ac0f0 0x18e2a723c 0x18e2a6adc 0x19822c328 0x1923a1ae0 0x1020de520 0x18e130360)
libc++abi.dylib: terminating with uncaught exception of type NSException

Как я утверждаю в ответе моего вопроса, связанного выше, я написал класс Swift, который предоставляет нужные мне библиотечные функции CocoaPod, позволяющие компилировать мой проект ...

import Foundation
import HGCircularSlider

@objc public class CircularSliderObjc: RangeCircularSlider
{
    @objc override open var startPointValue: CGFloat {

        get {
            return super.startPointValue;
        }

        set {
            super.startPointValue = newValue;
        }
    }

    @objc override open var endPointValue: CGFloat {

        get {
            return super.endPointValue;
        }

        set {
            super.endPointValue = newValue;
        }
    }

    @objc override open var endThumbImage: UIImage? {

        get {
            return super.endThumbImage;
        }

        set {
            super.endThumbImage = newValue;
        }
    }

    @objc override open var startThumbImage: UIImage? {

        get {
            return super.startThumbImage;
        }

        set {
            super.startThumbImage = newValue;
        }
    }
}

Как вы можете видеть в проекте, я выставил startPointValue как набор и получить. Однако вызов этой функции во время выполнения приводит к тому, что cra sh.

Вот заголовок вызывающего класса ...

#import "BaseViewController.h"
#import "Hyperion-Swift.h"

@interface TemperatureDeviceViewController : BaseViewController

@property (weak, nonatomic) IBOutlet CircularSliderObjc *rangeSlider;

И вызов в моем файле .m ...

[self.rangeSlider setStartPointValue:[self getSliderValueForTemp:startValue]];

Я предполагаю, что здесь пропущен один важный шаг?

ОБНОВЛЕНИЕ # 1

Я попробовал ответ, предложенный Максом что имеет большой смысл. Однако, поскольку это IBOutlet, в моем ViewController его решение действительно не подходит для моего варианта использования.

Я провел дальнейшую отладку и установил точки останова по всей моей функции startPointValue, чтобы увидеть, на что ссылается «super». Однако ни одна из точек останова не сработает до того, как произойдет cra sh. Поэтому я не уверен, что призыв к «супер» является действительной причиной? Думаю, вердикт по этому вопросу еще не вынесен.

1 Ответ

1 голос
/ 30 января 2020

Попробуйте изменить класс оболочки для инкапсуляции вместо наследования от базового класса. Например:

@objc public class CircularSliderObjc
{
    let slider: RangeCircularSlider // NOT @objc!
    @objc var startPointValue: CGFloat {
        get {
            return slider.startPointValue;
        }
        set {
            slider.startPointValue = newValue;
        }
    }

Таким образом, Objective- C даже не нужно знать, что класс Swift вообще существует. Я предполагаю, что это сбой на super, где что-то Swift-специфицируется c, доступ к которому осуществляется из Objective- C.

...