在本文中,我们将带你了解使用Objective-C代码在Swift中显示视图?在这篇文章中,我们将为您详细介绍使用Objective-C代码在Swift中显示视图?的方方面面,并解答swift调用c+
在本文中,我们将带你了解使用 Objective-C 代码在 Swift 中显示视图?在这篇文章中,我们将为您详细介绍使用 Objective-C 代码在 Swift 中显示视图?的方方面面,并解答swift 调用c++代码常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169、clang (objective-C) 模块和 Swift 模块有什么区别? Swift 模块、cmake - 为 Android 和 Windows 交叉编译 C++ 代码在 Windows 上、d3 动画 React Native 代码在 IOS 中很快,在 Android 中很慢?。
本文目录一览:- 使用 Objective-C 代码在 Swift 中显示视图?(swift 调用c++代码)
- C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169
- clang (objective-C) 模块和 Swift 模块有什么区别? Swift 模块
- cmake - 为 Android 和 Windows 交叉编译 C++ 代码在 Windows 上
- d3 动画 React Native 代码在 IOS 中很快,在 Android 中很慢?
使用 Objective-C 代码在 Swift 中显示视图?(swift 调用c++代码)
如何解决使用 Objective-C 代码在 Swift 中显示视图?
我通常使用 Obj-C,但我有 2 个 .swift 文件已导入到我的项目中,我想要做的是从我的 Obj-C viewController 文件之一(随后附加到 xib)
-(IBAction)gotoCompass:(id)sender {
let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc,animated: true,completion: nil)
}
这是我要使用的操作,.swift 文件名是
ContentView.swift 和 Compassheading.swift 我想使用上面的 IBAction 来展示其中一个,但目前它显示
''Use of undeclared identifier ''let''
我已经导入了 Bridging-Header 文件,.m 文件的顶部是
FirstViewController.m
@interface FirstViewController ()
@end
@implementation FirstViewController
编辑 -
这里是 ContentView.swift 的内容
import Foundation
import SwiftUI
struct Marker: Hashable {
let degrees: Double
let label: String
init(degrees: Double,label: String = "") {
self.degrees = degrees
self.label = label
}
func degreeText() -> String {
return String(format: "%.0f",self.degrees)
}
static func markers() -> [Marker] {
return [
Marker(degrees: 0,label: "N"),Marker(degrees: 30),Marker(degrees: 60),Marker(degrees: 90,label: "E"),Marker(degrees: 120),Marker(degrees: 150),Marker(degrees: 180,label: "S"),Marker(degrees: 210),Marker(degrees: 240),Marker(degrees: 270,label: "W"),Marker(degrees: 300),Marker(degrees: 330)
]
}
}
struct CompassMarkerView: View {
let marker: Marker
let compassDegress: Double
var body: some View {
vstack {
Text(marker.degreeText())
.fontWeight(.light)
.rotationEffect(self.textAngle())
Capsule()
.frame(width: self.capsuleWidth(),height: self.capsuleHeight())
.foregroundColor(self.capsuleColor())
Text(marker.label)
.fontWeight(.bold)
.rotationEffect(self.textAngle())
.padding(.bottom,180)
}.rotationEffect(Angle(degrees: marker.degrees))
}
private func capsuleWidth() -> CGFloat {
return self.marker.degrees == 0 ? 7 : 3
}
private func capsuleHeight() -> CGFloat {
return self.marker.degrees == 0 ? 45 : 30
}
private func capsuleColor() -> Color {
return self.marker.degrees == 0 ? .red : .gray
}
private func textAngle() -> Angle {
return Angle(degrees: -self.compassDegress - self.marker.degrees)
}
}
struct ContentView : View {
@Observedobject var compassheading = Compassheading()
var body: some View {
vstack {
Capsule()
.frame(width: 5,height: 50)
ZStack {
ForEach(Marker.markers(),id: \\.self) { marker in
CompassMarkerView(marker: marker,compassDegress: self.compassheading.degrees)
}
}
.frame(width: 300,height: 300)
.rotationEffect(Angle(degrees: self.compassheading.degrees))
.statusBar(hidden: true)
}
}
}
还有一个Compassheading.swift
文件;
import Foundation
import Combine
import CoreLocation
class Compassheading: NSObject,ObservableObject,CLLocationManagerDelegate {
var objectwillChange = PassthroughSubject<Void,Never>()
var degrees: Double = .zero {
didSet {
objectwillChange.send()
}
}
private let locationManager: CLLocationManager
override init() {
self.locationManager = CLLocationManager()
super.init()
self.locationManager.delegate = self
self.setup()
}
private func setup() {
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.headingAvailable() {
self.locationManager.startUpdatingLocation()
self.locationManager.startUpdatingheading()
}
}
func locationManager(_ manager: CLLocationManager,didUpdateheading newheading: CLheading) {
self.degrees = -1 * newheading.magneticheading
}
}
C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169
如何解决C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169
以下代码在 Visual Studio 2019 上生成错误 LNK2005 和 LNK1169。
LNK2005: "void__cdecl OverloadingPlus(void)" (?OverloadingPlus@@YAXXZ) already defined in main.obj
LNK1169: one or more multiply defined symbols found
我通过学习 Udemy 的课程达到了这一点,讲师似乎对此没有任何问题。
类似的问题似乎与使用全局变量、在头文件中定义函数、不使用 #ifndef
守卫有关……但据我所知,情况似乎并非如此。
此问题仅在包含 operator+
重载后才开始出现,但 operator<<
不会触发任何错误,即使它们已以相同方式声明和定义。
有趣的是,如果我删除对 OverloadingPlus.h
文件的任何引用,并将 #include Complex.h
添加到 main.cpp,问题就会消失。
我没有看到在 Complex.h
中包含 OverloadingPlus.h
是如何专门促成 operator+
的多重定义的,即使它在整个项目中只包含一次并且定义在 { {1}} 而不是在头文件中,如对类似问题的回答所指出的那样。
还尝试使用 Complex.cpp
语句围绕 OverloadingPlus.h
的内容,以确保它只使用一次而不会改变任何事情。
我试图在类中声明一个不同的 #ifndef
重载(你可以看到它被注释掉了),但它产生了相同的错误。
注释所有对任何其他文件的引用,以确保 operator+
定义只包含一次。也没有帮助。
代码如下:
main.cpp
Complex
OverloadingPlus.h
//#include "OverloadingAssignmentOperator.h"
//#include "OverloadingLeftBitShiftOperator.h"
//#include "ComplexnumberClass.h"
#include "OverloadingPlus.h"
int main() {
//OverloadingAssignmentOperator();
//OverloadingLeftBitShiftOperator();
//ComplexnumberClass();
OverloadingPlus();
return 0;
}
Complex.hpp
#ifndef OVERLOADING_PLUS_H
#define OVERLOADING_PLUS_H
#include "Complex.hpp"
using namespace complex;
void OverloadingPlus() {
Complex c1(1,4);
Complex c2(3,2);
std::cout << c1 + c2 << std::endl;
}
#endif
Complex.cpp
#ifndef COMPLEX_HPP
#define COMPLEX_HPP
#include <iostream>
namespace complex {
class Complex {
private:
double real;
double imaginary;
public:
Complex();
Complex(double,double);
Complex(const Complex&);
const Complex& operator=(const Complex& other);
//const Complex operator+(const Complex& r);
double getReal() const { return real; }
double getImaginary() const { return imaginary; }
};
Complex operator+(const Complex& l,const Complex& r);
std::ostream& operator<<(std::ostream& out,const Complex& c);
}
#endif // !__COMPLEX_HPP__
解决方法
该问题似乎与 VS2019 有关。将文件重命名为不同的名称,重建项目并将文件重命名回其原始名称解决了该问题。
虽然像其他人建议的那样使用 inline
确实绕过了这个问题,但它并没有解决这个特定的问题,因为冲突文件没有被多次包含。
您忘记“内联”您的 OverloadingPlus
。
inline void OverloadingPlus() {
Complex c1(1,4);
Complex c2(3,2);
std::cout << c1 + c2 << std::endl;
}
应该使链接器错误消失。
可能发生的情况是:您在多个编译单元中包含了“OverloadingPlus.h”(尽管您未能在问题中提供 #include 的所有实例)。
每次您在其中一个 .cpp 文件中包含“OverloadingPlus.h”时,添加 void OverloadingPlus
的另一个定义到您的程序中。链接器检测到这一点,无法决定“正确的”,因此给出错误。
clang (objective-C) 模块和 Swift 模块有什么区别? Swift 模块
如何解决clang (objective-C) 模块和 Swift 模块有什么区别? Swift 模块
Clang 模块记录在 here 中,Swift 模块记录在 here 中,没有详细说明。
既然 clang 是 Swift 内部也使用的 LLVM 前端编译器,那么 Swift 模块总是一个 Clang 模块吗?它们完全一样吗?
解决方法
它们是不同的。 不过在构建过程结束时,它们都需要链接到您的应用程序/库的其他 .o
和 .dylib
文件,以便运行。
Swift 模块
From Swift Serialization.md docs:
Swift 代码的基本分布单位是模块。模块包含声明,作为客户端编写代码的接口。
Swift acccess control docs:
模块是代码分发的单个单元:作为单个单元构建和交付的框架或应用程序,可以由另一个模块使用 Swift 的 import 关键字导入。
由
.target()
中的Package.swift
配置不能有子模块,所以用户不能在 Swift 中
import Module.Submodule
。用户仍然可以导入特定实体import struct PackageModel.Manifest
,但这比导入子模块要冗长得多。它的接口以
.swiftmodule
的形式存在。 What is a .swiftmodule
?。 documentation 说:从概念上讲,包含模块接口的文件与特定库的 C 头文件集合的用途大致相同。
编译器经常生成这个
.swiftmodule
文件,就像生成的 Objective-C 头文件一样,但它不是文本,而是二进制表示。它包括可内联函数的主体,很像 Objective-C 中的静态内联函数或 C++ 中的头文件实现。但是,Swift 模块确实包含私有声明的名称和类型。这允许您在调试器中引用它们,但这确实意味着您不应该在最深的秘密之后命名私有变量。 from WWDC 2018: Behind the Scenes of the Xcode Build Process- 因此,您的
.swiftmodule
(Swift 模块接口)中公开了私有声明。
- 因此,您的
在将纯 Objective-C 框架导入 Swift 时,Swift 编译器使用其内置的 clang 编译器来导入 Objective-C 头文件。
导入程序会在 Clangs .modulemap
中公开的头文件中找到该框架的声明。 (同样来自 WWDC2018)
- 将 Objective-C + Swift 框架导入 Swift 时,Swift 编译器使用 Umbrella 标头。
Clang 模块
- 由
YourModuleName.modulemap
文件配置(以前为module.map
,但已弃用),格式为 this - 可以有子模块,例如
std
模块有std.io
和std.complex
。 - clang 模块公开模块映射中指定的头文件。私人详细信息(在
.m
中)根本不会公开。 - 是对原始
#include
或#import
样式导入的改进,以改进构建过程(这是一个很大的主题,请阅读 Clang module docs)。
cmake - 为 Android 和 Windows 交叉编译 C++ 代码在 Windows 上
如何解决cmake - 为 Android 和 Windows 交叉编译 C++ 代码在 Windows 上
我想创建一个可以生成 MSVS 2019 解决方案的 cmake 项目 适用于 Windows 或 Android。
我创建了一个名为 myCmakeProject 的目录。
我创建了一个 CMakeLists.txt 文件并将其放在 myCmakeProject 目录中。
我还创建了一个测试 cpp 文件 main.cpp 并将其放在 myCmakeProject 目录中。
CMakeLists.txt 文件包含以下内容:
cmake_minimum_required(VERSION 3.10.2)
project(projectname)
add_library(libname STATIC main.cpp)
我在 myCmakeProject 目录中创建了一个名为“build”的子目录。
在“build”目录中,我创建了一个包含以下内容的 buildproject.bat 文件:
cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-16 -DANDROID_NDK=C:\\Users\\{user}\\AppData\\Local\\Android\\Sdk\\ndk\\22.1.7171670\\ -DCMAKE_TOOLCHAIN_FILE=C:\\Users\\{username}\\AppData\\Local\\Android\\Sdk\\ndk\\22.1.7171670\\build\\cmake\\android.toolchain.cmake ..
当我运行 buildproject.bat 时,它会生成一个 MSVS 2019 解决方案,它看起来几乎是正确的,但是如果 我没有弄错 MSVS 解决方案为 x86/x64 架构构建了一个静态库。我需要它来构建 为 Android 构建时为 arm64-v8a 或 armeabi-v7a,为 Windows 构建时为 x86/x64。
如何更改我的 cmake 项目以便 cmake 项目生成:
- 为 Windows(x86 或 x64)构建 C++ 代码的 MSVS 2019 解决方案
或
- 为 Android(32 位 arm 或 64 位 arm)构建 C++ 代码的 MSVS 2019 解决方案
d3 动画 React Native 代码在 IOS 中很快,在 Android 中很慢?
如何解决d3 动画 React Native 代码在 IOS 中很快,在 Android 中很慢??
我有一个地球仪,我想在 x 轴和 y 轴上旋转并使用 reanimated 2 放大和缩小,这是代码:
const Globe = () => {
const [x,setX] = useState(0);
const [y,setY] = useState(0);
const translateX = useSharedValue(0);
const translateY = useSharedValue(0);
const scale = useSharedValue(1);
const focalX = useSharedValue(0);
const focalY = useSharedValue(0);
const mapExtent = SVG_WIDTH > SVG_HEIGHT ? SVG_HEIGHT : SVG_WIDTH;
const onGestureEvent = useAnimatedGestureHandler<
PanGestureHandlerGestureEvent,{
x: number;
y: number;
}
>({
onStart: (_,ctx) => {
ctx.x = translateX.value;
ctx.y = translateY.value;
},onActive: ({translationX,translationY},ctx) => {
translateX.value = ctx.x + translationX;
translateY.value = ctx.y + translationY;
},});
const onPinchGesture = useAnimatedGestureHandler<
PinchGestureHandlerGestureEvent,{scale: number}
>({
onStart: (_,ctx) => {
ctx.scale = scale.value;
},onActive: (event,ctx) => {
scale.value = event.scale;
focalX.value = event.focalX;
focalY.value = event.focalY;
},});
const style = useAnimatedStyle(() => {
return {
transform: [
{translateX: focalX.value},{translateY: focalY.value},{translateX: -SVG_WIDTH / 2},{translateY: -SVG_HEIGHT / 2},{scale: scale.value},{translateX: -focalX.value},{translateY: -focalY.value},{translateX: SVG_WIDTH / 2},{translateY: SVG_HEIGHT / 2},],};
});
useAnimatedReaction(
() => ({x: translateX.value,y: translateY.value}),({x,y}) => {
requestAnimationFrame(() => {
runOnjs(setX)(x);
runOnjs(setY)(y);
});
},[translateX,translateY],);
return (
<PinchGestureHandler onGestureEvent={onPinchGesture}>
<Animated.View>
<PanGestureHandler onGestureEvent={onGestureEvent}>
<Animated.View style={style}>
<Svg width={SVG_WIDTH} height={SVG_HEIGHT}>
<G>
<Circle
cx={SVG_WIDTH / 2}
cy={mapExtent / 2}
r={mapExtent / 2}
fill={''#0099FF''}
/>
<GlobePath x={x} y={y} />
<GlobeCircles x={x} y={y} />
</G>
</Svg>
</Animated.View>
</PanGestureHandler>
</Animated.View>
</PinchGestureHandler>
);
};
我所做的是基于 x 和 y,我在 GlobePath 和 GlobeCircles 上像这样更新 d3 投影:
const GlobePath = ({x,y}: {x: number; y: number}) => {
const projection = d3
.geoOrthographic()
.rotate([x,-y])
.scale(mapExtent / 2)
.clipAngle(clipAngle)
.translate([SVG_WIDTH / 2,mapExtent / 2]);
const geoPath = d3.geoPath().projection(projection);
return (
<Path
d={geoPath(COUNTRIES) as string}
stroke={''#666666''}
strokeOpacity={0.3}
strokeWidth={0.6}
fill={''#ddddDD''}
opacity={1}
/>
);
};
const GlobeCircles = ({x,y}: {x: number; y: number}) => {
//first should be longitude
const coordinates = [
[19.744822,-34.633016],[80.229349,9.818078],[-98.862052,37.848794],];
const projection = d3
.geoOrthographic()
.rotate([x,mapExtent / 2]);
return (
<G>
{coordinates.map((data,i) => {
//calculate xy position from coordinates (long,lat)
const lang = data[0];
const lat = data[1];
const coordinate = projection([lang,lat]);
const xdata = (coordinate as [number,number])[0]; //first should be longitude
const ydata = (coordinate as [number,number])[1];
//if marker out of circle or back side marker will hide
const centerPos = projection.invert
? projection.invert([SVG_WIDTH / 2,mapExtent / 2])
: [0,0];
const d = d3.geodistance([lang,lat],centerPos as [number,number]);
const opacity = d > 1.57 ? 0 : 1;
return (
<Circle
key={`circle:${i}`}
cx={xdata}
cy={ydata}
r={6}
fillOpacity={0.5}
opacity={opacity}
fill="red"
/>
);
})}
</G>
);
};
现在我不太确定为什么我在 android 上的动画很慢,但在 ios 上却很快?代码看起来很简单,只是 x 和 y 发生了变化,而且捏放大和缩小在 android 上不起作用。帮助?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
关于使用 Objective-C 代码在 Swift 中显示视图?和swift 调用c++代码的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169、clang (objective-C) 模块和 Swift 模块有什么区别? Swift 模块、cmake - 为 Android 和 Windows 交叉编译 C++ 代码在 Windows 上、d3 动画 React Native 代码在 IOS 中很快,在 Android 中很慢?的相关知识,请在本站寻找。
本文标签: