Swift 包管理器混合语言源文件

问题描述 投票:0回答:4

出于某种原因,当我尝试在我的

swift build
文件上运行
Package.swift
时:导入 PackageDescription

let package = Package(
    name: "mobile-HDISegurado-ios",
    dependencies: [
        .package(url: "https://github.com/watson-developer-cloud/swift-sdk", from: "0.30.0"),
        ],
    targets: [
        .target(
            name: "mobile-HDISegurado-ios",
            dependencies: ["WatsonDeveloperCloud"],
            path: "mobile-HDISegurado-ios",
            exclude: [
                "Config",
                "Public",
                "Resources",
                ]
        )
    ] )

我遇到以下错误:

错误:目标为 '.../mobile-HDISegurado-ios' 包含混合语言源文件;不支持该功能

更多详情:

  • swift 打包工具-版本:4.1.0
  • 正在运行 Cocoapods 的项目工作区。
ios swift package
4个回答
18
投票

SPM 现在支持混合语言源文件,但您可能必须将它们分成多个目标。

来自相关文档

目标可以包含 Swift、Objective-C/C++ 或 C/C++ 代码,但单个目标不能将 Swift 与 C 系列语言混合。例如,一个 Swift 包可以有两个目标,一个包含 Objective-C、Objective-C++ 和 C 代码,另一个包含 Swift 代码。

实际上,您应该将 ObjC/C/C++ 文件移至一个目录,将 Swift 文件移至另一目录,然后修改 Package.swift:

products: [
    .library(
        name: "MyLibrary",
        targets: ["MyLibrarySwift", "MyLibraryObjC"]),
],
.target(name: "MyLibraryObjC",
        path: "Sources/MyLibraryObjC"
),
.target(name: "MyLibrarySwift",
        path: "Sources/MyLibrarySwift"
)

4
投票

2021 解决方案 - Xcode 11 及以上

此外,如果您在 Objective-C 项目或工作区中添加了 Swift 文件,但后来删除了所有 Swift 文件,Xcode 仍会在“构建设置”下保留一些条目。检查 Swift 相关选项,如下行所示:

  • SWIFT_INSTALL_OBJC_HEADER
  • SWIFT_OPTIMIZATION_LEVEL
  • SWIFT_VERSION

如果删除这些选项,Xcode 将不再给出错误,您可以安全地安装您的软件包,没有任何麻烦。

测试:

  • swift-tools-版本:5.1 及以上
  • Xcode 11.3 及以上版本

最好的。


3
投票

您正在使用 SPM 构建 iOS 项目吗?目前 SPM 不支持 iOS。不过,有一个 3rd 方工具可以填补这一空白:https://swiftxcode.github.io/

如果您正在为其他语言构建,那么您不能混合使用 Swift 文件和其他 C 系列语言文件。我遇到了同样的问题,因为我的目标路径中有一个 Objective-C 文件。我所做的只是将文件名包含在

exclude
数组中。

因此,如果“

mobile-HDISegurado-ios
”中有一个 Objective-C 类,请确保通过在
exclude
参数中传递文件名来忽略 Objective-C 类。


0
投票

在搜索了大量内容之后,如果您想在包中使用目标 c 文件,那么这里是我使用过的包文件

   // swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "DMixed",
    products: [
        // Products define the executables and libraries a package produces, making them visible to other packages.
        .library(
            name: "DMixed",
            targets: ["DMixed"]),
    ],
    targets: [
        // Targets are the basic building blocks of a package, defining a module or a test suite.
        // Targets can depend on other targets in this package and products from dependencies.
       
            .target(
                name: "ObjHel",
                 publicHeadersPath: "include"
            ),
            
            .target(
                    name: "DMixed", dependencies: ["ObjHel"]),
                
        .testTarget(
            name: "DMixedTests",
            dependencies: ["DMixed"]),
    ]
)

我的项目结构看起来像这样

你可以这样使用它

import UIKit
import ObjHel

class TestVCs: UIViewController,WPCustomNumberPadViewControllerDelegate
{
    func didTappedDone(withValue value: String!) {
        print("Abc")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.