2016-02-17 17:24:54 maindek 阅读数 1059
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2884 人正在学习 去看看 任苹蜻

第一步:创建和配置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 plain copy
 print?在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 plain copy
 print?在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>  

第五步:运行界面


2016-09-25 23:49:18 andanlan 阅读数 1554
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2884 人正在学习 去看看 任苹蜻

前言

苹果推出swift已经两年多了,到今年的九月份正式发布了swift的3.0版本,相信很多iOS开发或多或少已经使用过swift,由于维护的项目时间比较久了,以往都是使用OC开发,现在正在对已有一些功能进行改版重写,索性使用swift来做,以下是在使用OC与swift进行混编过程的一些介绍。

一、工程配置

1.Object-C bridging-header

  • Object-C bridging-header是什么?

Object-C bridging-header是指OC与swift的桥接文件,它的作用是在swift文件中你可以使用OC文件中声明(和实现)的变量、常量、类、函数、方法等。

  • 怎么使用?

我们现在拥有一个使用OC作为开发语言的iOS工程,在工程中只有OC相关的以.h或.m为后缀的文件。

我们用Xcode8打开我们的iOS工程,然后在我们的iOS工程中创建第一个swift文件(command+n或者file->new->file)。

此时会提示我们需要创建一个BridgingHeader文件。

选择创建,打开bridgingHeader文件可以看到描述Use this file to import your target's public headers that you would like to expose to Swift.,很明显这个文件就是用来引入文件到swift的。

想要在swift文件中使用OC文件,直接在这里引入你想导入的OC头文件就可以了,导入方式和OC文件的相互导入一样,如下:

 #import "OCClassFile.h"

至此,在bridging-header文件中import相关OC头文件,就可以在swift文件中使用OC了。

另外,假如你想给bridging-header文件重命名或者修改它的文件路径,你可以在build setting中进行修改配置,其中Swift Compiler General选项下的Object-C Bridging Header文件路径是相对路径,你可以新建一个文件夹或者给bridging-header文件重命名,只需要在这里更新一下新的文件路径就可以了。

2. Swift.h

  • Swift.h是什么

Swift.h文件是指Swift模块的头文件,类似于framework的头文件,它的作用是在OC文件中你可以使用swift中声明的变量、常量、类等。

  • 怎么用

在完成1的步骤后,然后build一次iOS工程,就会自动生成swift.h文件,在任意OC文件中直接引入swift.h文件,就可以使用swift文件中的内容了:

#import "ProjectName-Swift.h"
此处注意,工程名中如果存在空格" "或者中划线"-",需要用下划线"_"代替。

Swift.h文件是自动生成的,不需要手动创建,这个文件的内容也不需要手动管理,在每次build工程时都会被更新。其中只要在swift文件中使用public修饰的类(必须是继承自NSObject)和方法,都可以在OC中直接使用。

二、混编遇到的问题

  • OC NSMutableArray 与 swift Array

在Swift中使用OC类中的方法时,有些参数会是NSMutableArray的类型,Swift中创建的Array与其类型不一致,此时需要进行类型转换。

如果直接进行类型转换,Swift编译器会直接报错Cannot convert value of type '[SwiftClass]' to expected argument type 'NSMutableArray'

一个可行的办法是,先将Swift中的Array对象转换成NSArray,然后再讲NSArray转换成NSMutableArray。

class TestSwift: NSObject {

    dynamic func test() -> Void {
        let swiftArray = [NSObject]()
        let array = swiftArray as NSArray
        self.change(array: array.mutableCopy() as! NSMutableArray)
    }

    dynamic func change(array: NSMutableArray) -> Void {

    }
}
  • 字符串长度

在OC中的NSString对象会有length属性来获取字符串长度,swift中可以用characters.count来代替。

// Swift String
let swiftStr = "abc"
assert(swiftStr.characters.count > 0, "字符串长度不合法")

// OC String
let ocStr = NSString.init(string: "abc")
assert(ocStr.length > 0, "字符串长度不合法")
  • 字符串子串
// swift
let swiftStr = "abc"
let subStrIndex = swiftStr.index(swiftStr.endIndex, offsetBy: -1)
let subStr = swiftStr.substring(to: subStrIndex)
print(subStr)

// OC
let ocStr = NSString.init(string: "abc")
let ocSubStr = ocStr.substring(to: 2)
print(ocSubStr)

  • protocol命名

在使用过程中遇到一个问题是,在OC中有一个代理方法命名是以大写字母开头的,导致在swift中实现代理方法时编译器一直报错,始终找不到问题,把协议方法名改为小写(一般的驼峰命名)后,编译器不在报错。

2018-12-26 12:08:45 wz597002248 阅读数 221
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2884 人正在学习 去看看 任苹蜻


近期进行项目重构工作,将原先的项目拆分成子framework解耦,因为原项目是OC和swift混编的,遇到了很多framework层的混编问题,总结一下


在最上层项目中混编

swift引用swift

直接互相引用即可

swift引用OC

通过bridge桥接文件

OC引用swift

通过#import “项目名-Swift.h”

OC引用OC

直接#import “类名.h”


在Framework层内混编

swift引用swift

直接使用

swift引用OC

在项目的公共.h中加入需要引用的OC头文件,然后在项目的Build Phases中将其头文件移动到Public中

OC引用swift

#import <项目名/项目名-Swift.h> 如

#import <home_device_add_sdk/home_device_add_sdk-Swift.h>

OC引用OC

直接#import “类名.h”


跨Framework层混编

swift引用swift

添加项目依赖关系
需要import整个新的项目

swift引用OC

添加项目依赖关系
需要import整个新的项目

OC引用swift

添加项目依赖关系
#import <项目名/项目名-Swift.h> 如

#import <home_device_add_sdk/home_device_add_sdk-Swift.h>

OC引用OC

添加项目依赖关系
#import <项目名/类名.h>


上层项目引用Framework时混编

swift引用swift

添加项目依赖关系,然后在引用处添加import语句
import framework名,如

import home_device_add_sdk

swift引用OC

添加项目依赖关系即可

OC引用swift

添加项目依赖关系
#import <项目名/项目名-Swift.h> 如

#import <home_device_add_sdk/home_device_add_sdk-Swift.h>

OC引用OC

添加项目依赖关系
#import <项目名/被引用类名> 如

#import <home_device_add_sdk/HWDevAddResultController.h>
2019-04-21 05:08:30 weixin_38388284 阅读数 120
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2884 人正在学习 去看看 任苹蜻

最近工作需要做framework,遇到一些问题做下记录。

用swift语言创建framework,在创建2个target(swift,oc)做测试用。如下图

一、制作framework时注意的问题

写1个Class测试用

open class TestClass: NSObject {
    
    @objc open func test1(){
        print(#function)
    }
}

在oc调用swift的framework的时候,要引入库的桥接文件xxxx-Swift.h例如:

#import <STestFm/STestFm-Swift.h>

只有方法添加@objc的时候oc才能找到方法。

 

二、创建仓库

切换到项目目录下,在终端上

pod spec create STestFm

就会生成STestFm.podspec文件。

编辑STestFm.podspec文件。

Pod::Spec.new do |spec|



  spec.name         = "STestFm"
  spec.version      = "0.0.1"
  spec.summary      = "STestFm的概要说明"
  spec.description  = <<-DESC
STestFm的描述
                   DESC
  spec.homepage     = "远程仓库地址"
  spec.license      = "MIT"
  spec.ios.deployment_target = '8.0'
  spec.author             = { "yhl" => "753597827@qq.com" }
  spec.source       = { :git => "远程仓库地址.git", :tag => "#{spec.version}" }
  spec.source_files  = "Classes", "STestFm/*.{swift}"
  spec.swift_version = '4.2'
end

swift的framework一定要加spec.swift_version字段。

把代码托管在github上,并创建一个0.0.1的tag

验证podspec文件是否正确

pod lib lint --allow-warnings

验证通过

 

三、上传

查看trunk用命令

pod trunk me

如果没有trunk需要注册

pod trunk register 邮箱 名字

如果多人维护,添加其他维护者

pod trunk add-owner 项目名 邮件

上传

pod trunk push STestFm.podspec --allow-warnings 

四、私有库

pod repo add 项目名字 仓库地址
pod repo push xxx xxx.podspec --allow-warnings --sources=仓库地址

五、有修改

如果有修改把原先的tag删掉,重新打个tag,在修改下podspec(必须修改)文件,重新pod repo push就好了。

2016-12-26 21:21:20 lincsdnnet 阅读数 1450
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2884 人正在学习 去看看 任苹蜻

情景

我在桥接文件中直接写入

#import <SVProgressHUD/SVProgressHUD.h>

然后在swift文件中得重新导入才可以使用,即

import SVProgressHUD

项目中很多地方都需要SVProgressHUD,在每一个需要SVProgressHUD的swift文件中再导入一遍那可不是明智的选择

解决方案

创建桥接文件

target —> build setting, 搜索bridg
在Objective-C Bridging Header中填入头文件(项目名称-Bridging-Header.h)的路径
这里写图片描述

当然还有快速的方法,就是先创建一个.h文件(比如a.h),然后系统提示要不要帮我们创建桥接文件,选创建后把创建出来的a.h删除就好了,系统帮我们创建了桥接文件并设置好了路径。

在桥接文件中引用第三方库的文件名

注意导入格式:

#import "SVProgressHUD.h"

不是这种,不让坑死人呐

#import <SVProgressHUD/SVProgressHUD.h>

设置User Header Search Paths

target——>Build Setting 搜索 search
这里写图片描述
如图所求,设置搜索路径为${SRCROOT} ,后面为 recursive

现在就可以愉快的使用SVProgressHUD了

swift-知识

阅读数 47

没有更多推荐了,返回首页