零零乙 2014-06-02 20:05 采纳率: 33.3%
浏览 250
已采纳

如何从 Swift 调用 Objective-C 代码

In the new Swift language from Apple, how does one call Objective-C code?

Apple mentioned that they could co-exist in one application, but does this mean that one could technically re-use old classes made in Objective-C whilst building new classes in Swift?

The Reasoning

Objective-C is a platform-independent language, whereas Swift is platform-dependent. Writing non-platform-dependent code (business logic libraries) in Swift would thus not be wise. However, writing platform-dependent code in it (interface related for example) would be perfectly fine. Not to say it would be a good idea, however it is definitely an interest.

转载于:https://stackoverflow.com/questions/24002369/how-to-call-objective-c-code-from-swift

  • 写回答

15条回答 默认 最新

  • 程序go 2014-06-03 00:12
    关注

    Using Objective-C Classes in Swift

    ** If you have an existing class that you'd like to use, perform Step 2 and then skip to Step 5. (For some cases, I had to add an explicit #import <Foundation/Foundation.h to an older Objective-C File.) **

    Step 1: Add Objective-C Implementation -- .m

    Add a .m file to your class, and name it CustomObject.m.

    Step 2: Add Bridging Header

    When adding your .m file, you'll likely be hit with a prompt that looks like this:

    Enter image description here

    Click YES !

    If you did not see the prompt, or accidentally deleted your bridging header, add a new .h file to your project and name it <#YourProjectName#>-Bridging-Header.h.

    In some situations, particularly when working with Objective-C frameworks, you don't add an Objective-C class explicitly and Xcode can't find the linker. In this case, create your .h file named as mentioned above, then make sure you link its path in your target's project settings like so:

    Enter image description here

    Note

    It's best practice to link your project using the $(SRCROOT) macro so that if you move your project, or work on it with others using a remote repository, it will still work. $(SRCROOT) can be thought of as the directory that contains your .xcodeproj file. It might look like this:

    $(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
    

    Step 3: Add Objective-C Header -- .h

    Add another .h file and name it CustomObject.h.

    Step 4: Build your Objective-C Class

    In CustomObject.h

    #import <Foundation/Foundation.h>
    
    @interface CustomObject : NSObject
    
    @property (strong, nonatomic) id someProperty;
    
    - (void) someMethod;
    
    @end
    

    In CustomObject.m

    #import "CustomObject.h"
    
    @implementation CustomObject 
    
    - (void) someMethod {
        NSLog(@"SomeMethod Ran");
    }
    
    @end
    

    Step 5: Add Class to Bridging-Header

    In YourProject-Bridging-Header.h:

    #import "CustomObject.h"
    

    Step 6: Use your Object

    In SomeSwiftFile.swift:

    var instanceOfCustomObject: CustomObject = CustomObject()
    instanceOfCustomObject.someProperty = "Hello World"
    println(instanceOfCustomObject.someProperty)
    instanceOfCustomObject.someMethod()
    

    There is no need to import explicitly; that's what the bridging header is for.

    Using Swift Classes in Objective-C

    Step 1: Create New Swift Class

    Add a .swift file to your project, and name it MySwiftObject.swift.

    In MySwiftObject.swift:

    import Foundation
    
    class MySwiftObject : NSObject {
    
        var someProperty: AnyObject = "Some Initializer Val"
    
        init() {}
    
        func someFunction(someArg:AnyObject) -> String {
            var returnVal = "You sent me \(someArg)"
            return returnVal
        }   
    }
    

    Step 2: Import Swift Files to ObjC Class

    In SomeRandomClass.m:

    #import "<#YourProjectName#>-Swift.h"
    

    The file:<#YourProjectName#>-Swift.h should already be created automatically in your project, even if you can not see it.

    Step 3: Use your class

    MySwiftObject * myOb = [MySwiftObject new];
    NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
    myOb.someProperty = @"Hello World";
    NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
    NSString * retString = [myOb someFunction:@"Arg"];
    NSLog(@"RetString: %@", retString);
    

    Note:

    1. CodeCompletion wasn't behaving as accurately as I'd like it to. On my system, running a quick build with "cmd + r" seemed to help Swift find some of the Objective-C code and vice versa.

    2. If you add a .swift file to an older project and get error: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, try completely restarting Xcode.

    3. While it was originally possible to use pure Swift classes in Objective-C by using the @objc prefix, after Swift 2.0, this is no longer possible. See edit history for original explanation. If this functionality is reenabled in future Swift versions, the answer will be updated accordingly.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(14条)

报告相同问题?

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来