swift object-c互用

来源:互联网 发布:易语言游戏编程 编辑:程序博客网 时间:2024/05/11 23:50

我们先看一下Swift调用Object-c

首先我们创建一个OC类

到最后一步的时候发现多了一个确认框,点击Yes 系统会生成一个Swift和OC的转换桥梁。

他的命名规则是 项目名称-Bridging-Header.h  这个是系统生成的我们直接用。

接下来我们给刚创建的OC类添加一个方法

[objc] view plaincopy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface TestSwift2OC : NSObject  
  4.   
  5. -(void)TestOCStr;  
  6. @end  


实现方法


[objc] view plaincopy
  1. #import "TestSwift2OC.h"  
  2.   
  3. @implementation TestSwift2OC  
  4.   
  5. -(void)TestOCStr  
  6. {  
  7.     NSLog(@"这个是OC方法");  
  8. }  
  9. @end  


然后我们在刚才系统生成的文件TestSwiftOC-Bridging-Header.h 中添加一条语句

#import "TestSwift2OC.h"


好了  ,我们在swift中可以调用了,试一下

[objc] view plaincopy
  1. var testSwift2oc=TestSwift2OC()  
  2. testSwift2oc.TestOCStr()  


是不是已经出来了


下面我们看一下OC调用swift

我们新建一个swift 定义一个方法

[objc] view plaincopy
  1. import UIKit  
  2.   
  3. class TestOC2Swft: NSObject {  
  4.     func testSwftStr(){  
  5.         println("这个是Swift方法")  
  6.     }  
  7. }  

然后我们在oc类(只需要在调用swift 方法的类中导入就行)中首先导入一个头文件

头文件命名格式   项目名称-Swift.h (这个是系统自动生成的)

我们继续使用当前项目,我们创建的项目名称是TestSwiftOC所以我们需要导入的类就是  TestSwiftOC-Swift.h

看代码

[objc] view plaincopy
  1. #import "TestSwiftOC-Swift.h"  

然后我们在oc中调用

[objc] view plaincopy
  1. TestOC2Swft *testOC2Swift=[[TestOC2Swft alloc]init];  
  2. [testOC2Swift testSwftStr];  

调用就可以了



没有自动生成.h文件的自己创建一个.h文件


第一步:创建和配置Bridging-Header.h

Swift与OC进行混编,首先要有一个.h文件,这里使用Bridging-Header.h然后设置项目的Build Settings--Swift Compiler--Objective-C Bridging Header内容为DemoApp/Bridging-Header.h,这个与Bridging-Header.h位置有关,从项目的根目录开始在Objective-C Bridging Header选项里面写入Bridging-Header.h相对路径。


第二步:第三方项目依赖

对于第三方项目的依赖,一开始我打算用CocoaPods,但是过程曲折,最后一直报

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">ld: 218 duplicate symbols for architecture i386  
  2. clang: error: linker command failed with exit code 1 (use -v to see invocation)</span>  
我也没有办法了就把第三方项目源码拷贝到自己的项目里面,上图也可以看到我拷贝的事AFNetworking项目,然后在把源码加入到Build Phases--Compile Sources里面

第三步:修改Bridging-Header.h

在Bridging-Header.h中写入#import "AFNetworking.h"

第四步:调用OC

前面的工作做完后我们就可以调用第三方项目的功能了

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  ViewController.swift  
  3. //  DemoApp  
  4. //  
  5. //  Created by jiezhang on 14/10/24.  
  6. //  Copyright (c) 2014年 jiezhang. All rights reserved.  
  7. //  
  8.   
  9. import UIKit  
  10.   
  11. class ViewController: UIViewController {  
  12.   
  13.     @IBOutlet weak var weatherInfo: UITextView!  
  14.     override func viewDidLoad() {  
  15.         super.viewDidLoad()  
  16.         updateWeatherInfo()  
  17.     }  
  18.   
  19.     override func didReceiveMemoryWarning() {  
  20.         super.didReceiveMemoryWarning()  
  21.         // Dispose of any resources that can be recreated.  
  22.     }  
  23.   
  24.       
  25.     func updateWeatherInfo() {  
  26.         let manager = AFHTTPRequestOperationManager()  
  27.         let url = "http://api.openweathermap.org/data/2.5/weather"  
  28.         println(url)  
  29.         let params:NSDictionary = ["lat":"37.785834""lon":"-122.406417""cnt":0]  
  30.         println(params)  
  31.         manager.GET(url,  
  32.             parameters: params,  
  33.             success: { (operation: AFHTTPRequestOperation!,  
  34.                 responseObject: AnyObject!) in  
  35.                 self.weatherInfo.text = "JSON: " + responseObject.description!  
  36.             },  
  37.             failure: { (operation: AFHTTPRequestOperation!,  
  38.                 error: NSError!) in  
  39.                 self.weatherInfo.text = "Error: " + error.localizedDescription  
  40.                  
  41.         })  
  42.     }  
  43.   
  44. <p>}</p>  

0 0
原创粉丝点击