gyro永不抽风

ああああああああああああああああおおおおおおおおおおおおおおおお

Swift Objective-C混编问题

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;
}

}

__EOF__
-------------本文结束感谢您的阅读-------------

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

文章作者:gyro永不抽风

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

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

原始链接:http://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) 转载请保留原文链接及作者!

真的不买杯奶茶吗?T^T

欢迎关注我的其它发布渠道