迁移Swift项目到OC项目

news/2024/9/22 16:46:48/文章来源:https://www.cnblogs.com/liweihang/p/18383839

文件迁移


我直接把GuitarTunerApp文件夹迁移过去了
直接运行,提示
2个问题:

2.我们在

我们先解决第2个,选择swift的版本:
选择项目文件,然后选择你的目标(Target)。
点击 "Build Settings" 选项卡。
确保 Swift Compiler - Language 下的 Swift Version 设置正确,例如 Swift 5.0。

然后再运行:

这个错误通常是由于项目中存在多个 Storyboard 文件,或者 Storyboard 文件在多个地方被引用,导致构建时产生冲突。要解决这个问题,你可以按照以下步骤操作:

步骤 1: 检查 Storyboard 文件的引用
打开 Xcode 并进入你的项目。
在项目导航栏中,找到 LaunchScreen.storyboard 文件,右键点击它,然后选择 "Show in Finder"。
确保项目中只有一个 LaunchScreen.storyboard 文件。如果有多个类似的文件,你需要移除重复的文件或引用。
步骤 2: 检查 Build Phases 中的资源
选择你的项目文件,然后选择目标 (Target)。
在上面的选项卡中选择 "Build Phases"。
找到 "Copy Bundle Resources" 这一部分,检查是否有多个相同的 Storyboard 文件被列出。如果有,删除重复的文件。
步骤 3: 清理 Derived Data
在 Xcode 中,点击顶部菜单栏的 Xcode,然后选择 Preferences。
在弹出的窗口中,选择 Locations 选项卡。
点击 Derived Data 旁边的小箭头打开 Finder。
删除 Derived Data 文件夹中的内容,然后重新编译项目。
步骤 4: 检查 Target Membership
选择 LaunchScreen.storyboard 文件。
在右侧的文件检查器中,检查 "Target Membership" 部分。
确保 LaunchScreen.storyboard 只被分配给一个目标 (Target)。
步骤 5: 重新编译项目
完成上述步骤后,尝试重新编译项目,看看问题是否已经解决。

因为是项目直接迁移,我们搜索LaunchScreen.storyboard


选择 "Move to Trash",LaunchScreen.storyboard 文件将会被完全删除
现在运行,还有一个info.plist

我们需要合并info.plist。一些权限申请和资源。

然后删除AppDelegate 和 SceneDelegate。如果里面有一些初始化,要看要不要迁移到OC。

然后继续运行

解决第一个
CompileAssetCatalog 错误:这个错误通常与项目中的 Asset Catalog (例如图像、颜色资源) 的编译有关。可能的原因包括:

Asset Catalog 中的资源文件缺失或损坏。
路径配置错误,导致找不到资源文件。
与新迁移项目的合并导致冲突。
显然是Asset Catalog重复了。需要合并删除一个

继续运行

在 Swift 项目中缺少了 AudioKit 模块

我们在swift有几个库,要迁移过来


去OC项目相同位置添加
完成后

再次运行

这个代码IOS 14.0 以上才可以用。

在项目设置里面修改版本

创建运行

新增Swift功能模块

https://juejin.cn/post/6845166891619581966
当我们在 ObjC 项目中新建 Swift 文件时或者在 Swift 项目中新建 ObjC 文件时,Xcode 都会自动帮你新建一个 Objective-C bridging header file(当然我们也可以手动创建) .

在 Xcode 中创建文件时,选择目标是告诉 Xcode 该文件应该包含在哪个目标中。当你创建一个 .h 文件时,通常它只是一个头文件,不需要直接编译,因此在某些情况下你可能会看到 .h 文件没有选择目标。
.h 文件和目标:
一般的 .h 文件可能不会在创建时显示选择目标,这是因为它们在编译时是通过与 .m 或 .cpp 文件配对来引用的,不需要单独编译。

1.在完成创建Bridging-Header.h的步骤后,然后Command+B build一次iOS工程,就会自动生成 "项目名-Swift.h"的 隐藏文件文件,
2.简单点的话,在任意OC文件中直接引入 "项目名-Swift.h"文件,就可以使用项目中Swift中的内容了.一般可以在pch中 #import "项目名-Swift.h" 隐藏文件即可(注意引入的名字包含的Swift是大写开头)
3.验证接入成功:
Command+鼠标左键点击该文件,能显示出隐藏文件的内容,说明接入成功
image
image

成功了

在OC调用Swift

包含#import "ios-Swift.h"就可以使用Swift里面的类了。
image

1.Swift 类的可见性: 你需要确保 TunerScreenBuilder 类是 public 或 open,这样它才能被 Objective-C 代码访问。如果类是 internal(默认访问级别),它将无法被 Objective-C 代码看到。请检查 TunerScreenBuilder 类的定义,确保它是 public 或 open。

public final class TunerScreenBuilder {public static func build() -> UIViewController {// Implementation}
}

发现还不行,
https://blog.csdn.net/AdolphMacDonald/article/details/137788226
这里说
还要在桥接头文件中导入Objective-C的头文件后,我们就可以在Swift代码中调用Objective-C的类和方法了。需要注意的是,Objective-C的类和方法必须遵循一定的命名规范,才能在Swift中被正确识别。例如,Objective-C的类名和方法名需要使用@objc注解进行标记,以便Swift编译器能够识别。

添加@objc注解

@objc public final class TunerScreenBuilder {// 静态方法,用于构建并返回一个 UIViewController 实例@objc public static func build() -> UIViewController {}
}

image
只有继承自 NSObject 的类才能使用 @objc 注解。这是因为 @objc 注解是用来将 Swift 类和方法暴露给 Objective-C 使用的,而 Objective-C 类通常是 NSObject 的子类。

解决方法:
继承自 NSObject: 要解决这个问题,您可以让 TunerScreenBuilder 类继承自 NSObject,如下所示:

@objc public final class TunerScreenBuilder: NSObject {@objc public static func build() -> UIViewController {let tuner = TunerBuilder.build()let view = TunerViewImpl(notePickerView: NotePickerViewImpl(),tunerOffsetView: TunerOffsetViewImpl())let presenter = TunerPresenterImpl(view: view, tuner: tuner)view.presenter = presenterreturn view}
}

继续运行,成功
image
把Swift的调音器成功移植到OC项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/788324.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot+Dubbo

介绍Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目。这里是需要使用到Zookeeper的,可以理解为Nacos和OpenFeign,需要把不同的服务注册到Zookeeper然后不同服务之间需要相互调用,则…

3.外设GPIO、中断

GPIO:通用输入输出端口GPIO特点:1.快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)2.每个IO口都可以做中断3.支持8种工作模式GPIO电气特性:STM32工作电压范围:2 V ≤ VDD ≤ 3.6 VGPIO识别电压范围:  COMS端口:-0.3V ≤ VIL ≤ 1.164V(0);1.833V …

桌面软件/exe程序软件自动化大宝剑--lackey之初识

C/S架构端下的软件在IT发展长河中,渐渐的在大多数从业者已经淡忘。现有的PC端上的软件 也是在极力的前浪推后浪,更新替代一些老派的语言追寻潮流。互联网的软件开发就是IOT,HTTPclient ,鲜有 exe的桌面软件;某也喜欢追新潮学互联网技 术,自动化就接触APP WEB API并使用网…

全网最适合入门的面向对象编程教程:40 Python常用复合数据类型-枚举和enum模块的使用

在 Python 中,枚举(Enumeration, Enum)是一种复合数据类型,用于表示一组相关但不同的常量值。枚举类型允许我们使用人类可读的名称代替代码中的魔法数字或字符串,Python 提供了 enum 模块来实现枚举类型。全网最适合入门的面向对象编程教程:40 Python 常用复合数据类型-…

rn node 版本问题

报错信息:Command PhaseScriptExecution failed with a nonzero exit codeFailed to construct transformer: Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:79:19)at Object.createHash (node:crypto:139:10)at sta…

替代BeyondCompare,四款免费文件代码对比工具分享

Beyond Compare是一套内容比较工具软件。除了可以作文件比较以外,还可以比对文件目录、FTP目录及压缩包案的内容等,但是由于要收费且比较贵,很多公司也在规避工作电脑使用非授权软件的风险,所以分享四款平替Beyond Compare的文件代码对比软件工具。1、WinMerge WinMerge是一…

替代BeyondCompare,免费四款文件代码对比工具分享

Beyond Compare是一套内容比较工具软件。除了可以作文件比较以外,还可以比对文件目录、FTP目录及压缩包案的内容等,但是由于要收费且比较贵,很多公司也在规避工作电脑使用非授权软件的风险,所以分享四款平替Beyond Compare的文件代码对比软件工具。1、WinMerge WinMerge是一…

markdown格式测试

Editor.md hhh换行TEST 1 2 3 a bq d HEAD TEST Smart Test ...--目录 (Table of Contents) [TOCM] 目录Editor.md换行TESTHEAD TESTSmart TestHeading 1Heading 2Heading 3Heading 4Heading 5Heading 6Heading 1 link Heading linkHeading 2 link Heading linkHeading 3 link …

一图速览9种API接口测试

一图速览9种API接口测试,大家都懂了吗?值得收藏!

Serilog文档翻译系列(一) - 入门指南

保持优质文档是 Serilog 的优先事项。如果你发现文档中有缺失或不准确的内容,或者希望通过添加主题或教程来扩展 wiki,请通过问题追踪系统告知我们。 为什么选择Serilog? 与许多其他 .NET 库一样,Serilog 提供了基本的诊断日志记录功能,支持文件、控制台等多种方式。它易于…

数据分析1

数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律数据分析三剑客:Numpy,Pandas,MatplotlibNumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。一、…

CSS调试 (1)

https://www.bilibili.com/video/BV1KM4y1G7EF/内容转自【浏览器调试工具精讲】Chrome Dev Tools精讲,前端必看! 橙色:外边距 蓝色:本体。 绿色:内边距。CTRL+ F 可以搜索 输入某一个string 或者 css,section#someid xpath: //section/p 编辑样式