GVKun编程网logo

使用 Objective-C 代码在 Swift 中显示视图?(swift 调用c++代码)

1

在本文中,我们将带你了解使用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++代码)

使用 Objective-C 代码在 Swift 中显示视图?(swift 调用c++代码)

如何解决使用 Objective-C 代码在 Swift 中显示视图?

我通常使用 Obj-C,但我有 2 个 .swift 文件已导入到我的项目中,我想要做的是从我的 Obj-C viewController 文件之一(随后附加到 xib)

  1. -(IBAction)gotoCompass:(id)sender {
  2. let vc = UIViewController()
  3. vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
  4. self.present(vc,animated: true,completion: nil)
  5. }

这是我要使用的操作,.swift 文件名是

ContentView.swift 和 Compassheading.swift 我想使用上面的 IBAction 来展示其中一个,但目前它显示

  1. ''Use of undeclared identifier ''let''

我已经导入了 Bridging-Header 文件,.m 文件的顶部是

  1. FirstViewController.m
  2. @interface FirstViewController ()
  3. @end
  4. @implementation FirstViewController

编辑 -

这里是 ContentView.swift 的内容

  1. import Foundation
  2. import SwiftUI
  3. struct Marker: Hashable {
  4. let degrees: Double
  5. let label: String
  6. init(degrees: Double,label: String = "") {
  7. self.degrees = degrees
  8. self.label = label
  9. }
  10. func degreeText() -> String {
  11. return String(format: "%.0f",self.degrees)
  12. }
  13. static func markers() -> [Marker] {
  14. return [
  15. 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)
  16. ]
  17. }
  18. }
  19. struct CompassMarkerView: View {
  20. let marker: Marker
  21. let compassDegress: Double
  22. var body: some View {
  23. vstack {
  24. Text(marker.degreeText())
  25. .fontWeight(.light)
  26. .rotationEffect(self.textAngle())
  27. Capsule()
  28. .frame(width: self.capsuleWidth(),height: self.capsuleHeight())
  29. .foregroundColor(self.capsuleColor())
  30. Text(marker.label)
  31. .fontWeight(.bold)
  32. .rotationEffect(self.textAngle())
  33. .padding(.bottom,180)
  34. }.rotationEffect(Angle(degrees: marker.degrees))
  35. }
  36. private func capsuleWidth() -> CGFloat {
  37. return self.marker.degrees == 0 ? 7 : 3
  38. }
  39. private func capsuleHeight() -> CGFloat {
  40. return self.marker.degrees == 0 ? 45 : 30
  41. }
  42. private func capsuleColor() -> Color {
  43. return self.marker.degrees == 0 ? .red : .gray
  44. }
  45. private func textAngle() -> Angle {
  46. return Angle(degrees: -self.compassDegress - self.marker.degrees)
  47. }
  48. }
  49. struct ContentView : View {
  50. @Observedobject var compassheading = Compassheading()
  51. var body: some View {
  52. vstack {
  53. Capsule()
  54. .frame(width: 5,height: 50)
  55. ZStack {
  56. ForEach(Marker.markers(),id: \\.self) { marker in
  57. CompassMarkerView(marker: marker,compassDegress: self.compassheading.degrees)
  58. }
  59. }
  60. .frame(width: 300,height: 300)
  61. .rotationEffect(Angle(degrees: self.compassheading.degrees))
  62. .statusBar(hidden: true)
  63. }
  64. }
  65. }

还有一个Compassheading.swift文件;

  1. import Foundation
  2. import Combine
  3. import CoreLocation
  4. class Compassheading: NSObject,ObservableObject,CLLocationManagerDelegate {
  5. var objectwillChange = PassthroughSubject<Void,Never>()
  6. var degrees: Double = .zero {
  7. didSet {
  8. objectwillChange.send()
  9. }
  10. }
  11. private let locationManager: CLLocationManager
  12. override init() {
  13. self.locationManager = CLLocationManager()
  14. super.init()
  15. self.locationManager.delegate = self
  16. self.setup()
  17. }
  18. private func setup() {
  19. self.locationManager.requestWhenInUseAuthorization()
  20. if CLLocationManager.headingAvailable() {
  21. self.locationManager.startUpdatingLocation()
  22. self.locationManager.startUpdatingheading()
  23. }
  24. }
  25. func locationManager(_ manager: CLLocationManager,didUpdateheading newheading: CLheading) {
  26. self.degrees = -1 * newheading.magneticheading
  27. }
  28. }

C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169

C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169

如何解决C++ 代码在 VS2019 上生成错误 LNK2005 和 LNK1169

以下代码在 Visual Studio 2019 上生成错误 LNK2005 和 LNK1169。

  1. LNK2005: "void__cdecl OverloadingPlus(void)" (?OverloadingPlus@@YAXXZ) already defined in main.obj
  1. 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

  1. Complex

OverloadingPlus.h

  1. //#include "OverloadingAssignmentOperator.h"
  2. //#include "OverloadingLeftBitShiftOperator.h"
  3. //#include "ComplexnumberClass.h"
  4. #include "OverloadingPlus.h"
  5. int main() {
  6. //OverloadingAssignmentOperator();
  7. //OverloadingLeftBitShiftOperator();
  8. //ComplexnumberClass();
  9. OverloadingPlus();
  10. return 0;
  11. }

Complex.hpp

  1. #ifndef OVERLOADING_PLUS_H
  2. #define OVERLOADING_PLUS_H
  3. #include "Complex.hpp"
  4. using namespace complex;
  5. void OverloadingPlus() {
  6. Complex c1(1,4);
  7. Complex c2(3,2);
  8. std::cout << c1 + c2 << std::endl;
  9. }
  10. #endif

Complex.cpp

  1. #ifndef COMPLEX_HPP
  2. #define COMPLEX_HPP
  3. #include <iostream>
  4. namespace complex {
  5. class Complex {
  6. private:
  7. double real;
  8. double imaginary;
  9. public:
  10. Complex();
  11. Complex(double,double);
  12. Complex(const Complex&);
  13. const Complex& operator=(const Complex& other);
  14. //const Complex operator+(const Complex& r);
  15. double getReal() const { return real; }
  16. double getImaginary() const { return imaginary; }
  17. };
  18. Complex operator+(const Complex& l,const Complex& r);
  19. std::ostream& operator<<(std::ostream& out,const Complex& c);
  20. }
  21. #endif // !__COMPLEX_HPP__

解决方法

该问题似乎与 VS2019 有关。将文件重命名为不同的名称,重建项目并将文件重命名回其原始名称解决了该问题。

虽然像其他人建议的那样使用 inline 确实绕过了这个问题,但它并没有解决这个特定的问题,因为冲突文件没有被多次包含。

,

您忘记“内联”您的 OverloadingPlus

  1. inline void OverloadingPlus() {
  2. Complex c1(1,4);
  3. Complex c2(3,2);
  4. std::cout << c1 + c2 << std::endl;
  5. }

应该使链接器错误消失。

可能发生的情况是:您在多个编译单元中包含了“OverloadingPlus.h”(尽管您未能在问题中提供 #include 的所有实例)。

每次您在其中一个 .cpp 文件中包含“OverloadingPlus.h”时,添加 void OverloadingPlus 的另一个定义到您的程序中。链接器检测到这一点,无法决定“正确的”,因此给出错误。

clang (objective-C) 模块和 Swift 模块有什么区别? Swift 模块

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.iostd.complex
  • clang 模块公开模块映射中指定的头文件。私人详细信息(在 .m 中)根本不会公开。
  • 是对原始 #include#import 样式导入的改进,以改进构建过程(这是一个很大的主题,请阅读 Clang module docs)。

cmake - 为 Android 和 Windows 交叉编译 C++ 代码在 Windows 上

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 文件包含以下内容:

  1. cmake_minimum_required(VERSION 3.10.2)
  2. project(projectname)
  3. add_library(libname STATIC main.cpp)

我在 myCmakeProject 目录中创建了一个名为“build”的子目录。

在“build”目录中,我创建了一个包含以下内容的 buildproject.bat 文件:

  1. 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 项目生成:

  1. 为 Windows(x86 或 x64)构建 C++ 代码的 MSVS 2019 解决方案

  1. 为 Android(32 位 arm 或 64 位 arm)构建 C++ 代码的 MSVS 2019 解决方案

d3 动画 React Native 代码在 IOS 中很快,在 Android 中很慢?

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 上不起作用。帮助?

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱: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 中很慢?的相关知识,请在本站寻找。

本文标签: