文件迁移
我直接把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+鼠标左键点击该文件,能显示出隐藏文件的内容,说明接入成功
成功了
在OC调用Swift
包含#import "ios-Swift.h"就可以使用Swift里面的类了。
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 {}
}
只有继承自 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}
}
继续运行,成功
把Swift的调音器成功移植到OC项目。