Swift Objective-C混编问题

新博客地址:https://gyrojeff.top,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客👇

本文标题:Swift Objective-C混编问题

文章作者:gyro永不抽风

发布时间:2020年04月10日 - 22:04

最后更新:2020年09月15日 - 07:09

原始链接:http://hexo.gyrojeff.moe/2020/04/10/Swift-Objective-C%E6%B7%B7%E7%BC%96%E9%97%AE%E9%A2%98/

许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请保留原文链接及作者!

Introduction

在实际开发过程当中,Swift在某些情况运行效率低下,我们需要C++来实现某些功能。这就引入了混编问题。其实Swift不仅可以和Objective-C混编,还可以和C、C++混编。

和Objective-C混编

众所周知,Objective-C需要头文件来开放接口,而要让Swift和Objective-C混编,就需要将Objective-C的方法开放接口给Swift。

具体实现

New File -> Objective-C,系统会弹出弹窗问要不要Create Bridge File,选择Yes。然后在Objective-C文件中import这个Bridge File作为头文件,开放的接口写在Bridge File当中

Objective-C:

1
2
3
4
5
6
7
#import "xxxxx-Bridge-File.h"

@implementation ClassA
+ (void) testMethod :(double) parameterA :(double) parameterB {
NSLog(@"Hello World!");
}
@end

Header:

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>

@interface ClassA : NSObject

+ (void) testMethod :(double) parameterA :(double) parameterB;

@end

Swift调用:

1
ClassA.testMethod(1.0, 2.0)

关于在项目中的设置

设置部分可以在Build Setting中找到(项目文件中)

C、C++混编的实现

我们会发现,Objective-C的语法糖不多,我们更想要的是C++。而众所周知,Objective-C是可以调用Cpp的,而且将后缀名改为.mm之后,是Objective-C++,支持C++的方法及语法。全部都不难实现。其实只需要将所有东西分装起来即可。

比如我做OpenCV处理时分装的库:

HQMatProcessor.hpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//
// HQMatProcessor.hpp
// Page Dewarper
//
// Created by Jefferson Qin on 2020/4/8.
// Copyright &copy; 2020 Jefferson Qin. All rights reserved.
//

#ifndef HQMatProcessor_hpp
#define HQMatProcessor_hpp

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <opencv2/opencv.hpp>

namespace HQCV {
cv::Mat getSharpened(cv::Mat src);
cv::Mat getGray(cv::Mat src);
cv::Mat getSobelX(cv::Mat src);
cv::Mat getSobelY(cv::Mat src);
cv::Mat getSobel(cv::Mat src);
cv::Mat getGaussian(cv::Mat src);
cv::Mat drawPoint(cv::Mat src, double x, double y);
cv::Mat drawLine(cv::Mat src, double x1, double y1, double x2, double y2);
}

#endif /* HQMatProcessor_hpp */

HQMatProcessor.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//
// HQMatProcessor.cpp
// Page Dewarper
//
// Created by Jefferson Qin on 2020/4/8.
// Copyright &copy; 2020 Jefferson Qin. All rights reserved.
//

#include "HQMatProcessor.hpp"

namespace HQCV {

cv::Mat getSharpened(cv::Mat src) {
cv::Mat kernel = (cv::Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cv::Mat ret;
cv::filter2D(src, ret, CV_32F, kernel);
cv::convertScaleAbs(ret, ret);
return ret;
}

cv::Mat getGray(cv::Mat src) {
cv::Mat dst;
cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);
return dst;
}

cv::Mat getSobelX(cv::Mat src) {
cv::Mat dst;
cv::Sobel(src, dst, CV_16S, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
cv::convertScaleAbs(dst, dst);
return dst;
}

cv::Mat getSobelY(cv::Mat src) {
cv::Mat dst;
cv::Sobel(src, dst, CV_16S, 0, 1, 3, 1, 0, cv::BORDER_DEFAULT);
cv::convertScaleAbs(dst, dst);
return dst;
}

cv::Mat getSobel(cv::Mat src) {
cv::Mat dst;
cv::addWeighted(HQCV::getSobelX(src), 0.5, HQCV::getSobelY(src), 0.5, 0, dst);
return dst;
}

cv::Mat getGaussian(cv::Mat src) {
cv::Mat dst;
cv::GaussianBlur(src, dst, cv::Size(3, 3), 0, 0, cv::BORDER_DEFAULT);
return dst;
}

cv::Mat drawPoint(cv::Mat src, double x, double y) {
cv::Mat dst = src.clone();
cv::circle(dst, cv::Point(x, y), 8, cv::Scalar(0, 255, 0, 255));
return dst;
}

cv::Mat drawLine(cv::Mat src, double x1, double y1, double x2, double y2) {
cv::Mat dst = src.clone();
cv::line(dst, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(0, 255, 0, 255));
return dst;
}

}

posted @ 2020-09-15 09:13  gyro永不抽风  阅读(159)  评论(0编辑  收藏  举报