创建和导入Swift框架

17

我是Swift编程的新手。 我需要创建纯Swift框架并将其导入到我的现有纯Swift项目中。 当我尝试导入Swift框架时,我得到了这个错误信息:

"Could not build Objective-C module '<myModule>'"

框架文件结构

Test.h

 import Foundation

public class Test {
    class func printTest() {
        println("111");
    }
}

Asdf.h

import UIKit
public class Asdf: Test {
    class func echo() {
        println(888);
    }
}

myModule-Swift.h

#ifndef <myModule>_<myModule>_Swift_h
#define <myModule>_<myModule>_Swift_h

#endif
在构建框架后,我将框架添加到我的现有项目中,出现了这个问题: Project Structure and import problem screen 我做错了什么?谢谢帮助!
@findall 评论答案 - 我试图将所有框架文件添加到我的项目根目录和项目文件夹内部,但仍然遇到相同的错误。 Add Framework files to project root Add Framework files inside project folder

1
我也想知道如何完美地做到这一点。但是,有一个解决方法。不仅可以将“.framework”添加到使用方项目的层次结构中,还可以添加框架自身的项目。完成后,框架中的所有公共符号都可以从使用方看到。 - findall
我尝试添加文件(我编辑了问题),但仍然遇到相同的错误,您能否详细解释一下? - styopdev
不是框架文件,尝试通过“项目导航器”引用“.xcodeproj”中的框架。 如果要在真实设备上部署,还必须将“.framework”添加到“嵌入式二进制文件”。 - findall
我已经在我的项目中添加了.xcodeproj,但问题并没有得到解决。 - styopdev
好的,请让我尝试逐步解释我所做的事情作为答案。 我还不擅长英语,所以希望不会让您感到困惑。(-_-;) - findall
4个回答

19

我已经完成以下步骤:

  1. 创建一个框架项目,例如命名为“FooKit”(选择 Cocoa Touch Framework)。
  2. 创建一个“.swift”文件,并添加一个公共符号,例如public func foo()
  3. 创建一个使用方(应用)项目。(我选择了Single View Application
  4. 通过Finder打开“FooKit”的根目录,在应用程序项目中通过Project Navigator将“FooKit.xcodeproj”拖放到那里。
  5. 在应用程序的Build Phases设置中将“FooKit”添加到Target Dependencies
  6. 在应用程序的General设置中将“FooKit.framework”添加到Embedded Binaries

现在您可以像这样在使用方应用程序中构建代码。

import FooKit

func bar() {
    foo()
}

10
这对我也起作用,但我想知道为什么我们不能只是将编译好的框架拖放进去?xcworkspace在幕后执行了什么操作以使其正常工作? - Mazyod
2
我有相同的问题。Mazyod - Christos Chadjikyriacou
2
@findall,这对我来说没有意义。 如果我们要放置.xcodepoj文件,那么框架的需求是什么? 我的意思是代码没有安全性? - Mohammad Zaid Pathan
大家好,我和你们一样有同样的问题。我正在按照下面的教程制作框架,并添加框架。https://medium.com/@PyBaig/build-your-own-cocoa-touch-frameworks-in-swift-d4ea3d1f9ca3#.wftv6kglt但当我尝试导入时,显示“没有这个模块”。 - Saty
@ZaidPathan...最近是否还是将.xcodeproject放入框架中,或者最近发生了任何更改? - Saty
显示剩余7条评论

3
在Xcode 7.2中使用Swift 2.1,我成功解决了上述错误,方法如下: 1)Build Settings->Packaging->Defines Module = Yes 2)Build Settings->Swift Compiler - Code Generation->Install Objective-C Compatibility Header = Yes(如果您不需要将Swift框架导入Objective C,请将此设置为No) 3)清除Build Settings->Swift Compiler - Code Generation->Objective-C Bridging Header的字符串值 4)Build Settings->Swift Compiler - Code Generation->Objective-C Generated Interface Header Name = Foo-Swift.h(如果您不需要将Swift框架导入Objective C,就像第3步一样清除此设置) 5)确保Build Settings->Packaging->Product Name = Foo 6)向您的框架的公共umbrella header (Foo.h)添加以下行,以便将Swift代码导入到Objective C中:
#import "Foo-Swift.h"

(如果您不需要将Swift代码导入到Objective-C中,则跳过此步骤)

6)在想要使用模块Foo的Swift文件中添加以下行:

import Foo

重要提示:

1)确保在文件检查器中将你的伞头文件Foo.h设置为public,否则这个方法不起作用。

2)如果您在Objective C文件中使用纯Swift框架,请确保:

  • 通过转到Foo.h并单击Xcode代码编辑器左上角菜单,然后选择Includes->Foo-Swift.h,生成了正确的接口(我不得不重建Foo框架多次,直到Xcode跟上变化并在Objective C中生成了正确的接口,所以您可能需要这样做)

  • 你的swift类从NSObject继承,否则它们不会对Objective C代码可用


这应该排名更高。我无法感谢你们的足够。 - jeffctown
很高兴我能帮助到你。 :) - jvarela

2
此外,对于@jvarela的回答,在Xcode 9和Swift 4中,要在Objective C项目中导入Swift框架,您必须为希望导入到Objective C项目中的所有类、方法和变量添加@objc标记。举个例子:
@objc public class Foo: NSObject {

    @objc public var fooDescription: String

    @objc public func foo(){

    }

}

1
关于Swift:
创建框架:-
  1. Start Xcode -> Create a new Xcode Project -> iOS -> Framework & Library -> Cocoa Touch Framework -> Name the framework(ex. sampleCocoaFramework) -> Create.

  2. Set Taget -> General -> Deployment info -> Deployment Target.

  3. Add a public class: File -> New File -> iOS -> Swift File -> Name it (ex. openCocoaClass) -> Create.

  4. Now add some code to the openCocoaClass.swift.

    import Foundation
    
    public class openCocoaClass {
    
        public init() {
    
        }
    
        public var samplePublicVariable = "samplePublicVariable @ openCocoaClass"
    
        public func samplePublicFunction()
        {
            print("samplePublicFunction @ openCocoaClass")
        }          
    

    }

  5. Clean the project : Product -> Clean

  6. Configure the scheme settings : Product -> Scheme -> Edit Scheme -> Run -> Build Configuration -> Release.

  7. Build the framework : Product -> Build.

  8. Export the framework : Products -> Select the framework -> Identity and type -> Full Path -> Released Framework.

将框架添加到项目中:

  1. 启动Xcode项目并命名(例如CocoaFrameworkTest)。

  2. 将sampleCocoaFramework.framework拖放到CocoaFrameworkTest的项目文件夹中。

  3. 目标 -> 通用 -> 嵌入式二进制文件 -> 添加其他 -> 选择框架 -> 如果需要,复制项目 -> 完成。

在ViewController上访问框架:

import UIKit
import sampleCocoaFramework


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let frameworkObject =  openCocoaClass.init()
        frameworkObject.samplePublicFunction()
        print(frameworkObject.samplePublicVariable)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

4
这个步骤在Xcode 8.0中的位置是:8.导出框架:产品 -> 选择框架 -> 身份和类型 -> 完整路径 -> 发布的框架。 - Sentry.co
我该如何根据架构添加框架,而不是制作一个臃肿的框架。 - Satyam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接