2019-07-24 14:09:36 chungeshihuatian 阅读数 667
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

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

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

1、我们先创建一个OC的项目MyFirstOCUseSwiftDemo

2、我们点击Target看到右边选择Build Settings,把Defines Module改为YES,

3、我们回到工程目录下,New File一个Swift File,起名为MyFristSwift,此时会弹框提示我们是否创建一个桥接文件,如图:

4、创建好之后我们再次选择项目的Target看到右侧的Build Settings选项,往下滑动会看到这样一个目录:

此时是系统为我们自动创建了桥接"项目名-Swift"文件和"项目名-Bridging-Header"文件;

5、接下来我们开始创建自己的Swift文件,新建一个Swift起名为:MyFristSwift,它看起来应该长这样:

import Foundation
import UIKit


class MyFristSwift: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
     
        self.view.backgroundColor = UIColor.green

    }
    
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

6、接下来我们要在OC的控制器(也就是你想要调用Swift的OC控制器)里边import一下第四步图中展示的swift文件,此时注意的是这个头文件是手动写的,你也可以在第四步中复制Objcective-C Generated Interface Header Name对应的值;

7、好了,这是最后一步,在OC控制器中 创建一个按钮进入我们的swift页面吧,它应该是这样的:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //创建属于我们自己的按钮
    [self.view addSubview:self.nextBtn];

}
- (void)nextBtnClicked:(UIButton *)btn{
    // 使用Swift的类
    MyFristSwift *swiftVC = [[MyFristSwift alloc] init];
    [self presentViewController:swiftVC animated:YES completion:nil];
}
-(UIButton *)nextBtn{
    
    if (!_nextBtn) {
        
        _nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _nextBtn.frame = CGRectMake(40, 100, 100, 44);
        _nextBtn.layer.masksToBounds = YES;
        _nextBtn.layer.cornerRadius = 4;
        _nextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
        [_nextBtn setTitle:@"进入Swift" forState:UIControlStateNormal];
        [_nextBtn setBackgroundColor:[UIColor brownColor]];
        [_nextBtn addTarget:self action:@selector(nextBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _nextBtn;
}

 

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>
2016-08-02 15:51:00 fei332085762 阅读数 13
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

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

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

OC引用Swift

在混合项目中Swift代码默认使用module管理,这时想要OC引用Swift需要把Swift代码作为module暴露给整个项目,修改Build Settings如下:


1480065-da206521f0347aff.png

然后创建一个ProjectName.swift文件,在OC文件中引入该文件就可以随意引用Swift代码了;

Swift引用OC

同理,Swift引用OC是通过ProjectName-Bridging-Header将OC代码暴露给整个项目,这里需要考虑两种情况如下
1.在Swift项目中创建OC文件会自动生成ProjectName-Bridging-Header文件,在该桥接文件里引入OC头文件就可以引用OC代码了,同时系统帮我们设置好了文件路径;

2.如果最初创建OC文件时没有创建桥接文件,此后创建OC文件不会提示创建桥接文件,这时需要自己创建桥接文件ProjectName-Bridging-Header如下


1480065-e835e7ad22de0583.png

手动创建桥接文件后要在Build Settings中设置路径,搜索bridging找到Swift Compiler-General -> Objective-C Bridging Header,然后把桥接文件拖进来就大功告成了。


1480065-d0757040ef39c92f.png
2017-07-10 11:16:59 polarGW 阅读数 577
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

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

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

随着swift趋向于稳定,越来越多的公司启动的新项目也想使用swift过把瘾,使用swift的好处与弊端不再赘述。目前版本是swift3.0,而且Xcode9beta版中已经更新到swift4.0。使用swift开发是大趋势,这里从以下几个方面看一下如何进行简单的配置。

  • OC中引用Swift文件
  • Swift中引用OC文件,以及第三方库
  • Xcode8以后编译swift2.x
  • OC引用Swift第三方库

一、OC中如何引用Swift文件:
首先先来创建一个object-c语言的项目,然后直接一个swift类,这时会弹出如下提示:
配置桥接头文件
先选择Do not Create,稍后会提到,系统会自动创建一个格式:xxx项目名-Swift.h的头文件,不显示但是可以直接引用,直接引用,这时发现报错了。
报错了
这是为什么呢?虽然一般情况下是直接引用xxx项目名-Swift.h,真正需要引用的是Product Moudle Name对应的文件名:
模块名配置
也可在此基础上搜索swift,对应的文件名正是想要的文件名,为什么上面还要提搜索pack找Product Moudle Name直接搜swift不就好了吗?因为这个名字是拼出来的:Product Moudle Name-Swift.h,可以去pack里面删除Product Moudle Name对应的内容,再回来搜swift看一下就明白了。
搜索swift
项目在创建的时候名称有的时候可能有歧义系统自动帮我们修改。swift在OC项目中是作为Moudle来使用的,名称继承自PROJECT下的Product Moudle Name,导入时报错请自行检查是否匹配。
目前为止导入头文件成功了,调用一下SwiftTest类中的log方法。
方法配置
却发现一直报未定义该类的错误:
未定义报错
点击生成的项目名-Swift.h的头文件里面却发现没有关于Swift声明:
未声明该类
后来经过查找发现是因为没有创建桥接文件导致的,手动来创建一下桥接文件,命名规则:项目名-Bridging-Header。
创建桥接文件
到项目里手动配置文件路径:
配置方法
配置完成后clean然后build点击项目名-Swift.h进入就可以发现定义swift类的声明,Command + R 运行成功。
二、Swift中引用OC文件,以及第三方库
swift引用OC文件比较简单:
1)创建桥接文件(参考上面步骤)
2)把需要用到类或者第三方SD、framework头文件引入
3)直接在swift文件中使用
由于比较简单不在赘述,稍后会提到注意事项。
三、Xcode8以后编译swift2.x以及pod引用的swift框架
Xcode8以后swift的currentVersion改为3.0,如果是swift2.x项目打开往往会有这样的提示:
转换提示
如果你想转换的直接点击convert,但是要注意备份小心一万点爆红,如果点击了later之后又想转换了可以进行如下操作:
手动转换
如果想要继续编译swift2.x需要设置版本:
设置版本
如果没有使用第三方框架那么现在就可以build了,而且是成功的,但是如果使用了第三方的framework,那么每个framework都需要设置一次,如下:
设置pod的版本
这里几点需要注意的:
1)pod里面的framework的版本必须与taget里面的一致否则编译失败。
2)必须与最低版本一致有一个framework使用了swift2.x其他都必须设置为YES
3)任何时候点击convertToCurrentVersion都是转换到最新版本也就是当前的swift3.0,即使你设置了使用以前版本再次进行转换也是转换到swift3.0不会转换到以前版本。
4)每次pod以后之前的配置都会重置,需要从新设置版本。但是可以在Podfile里面加入如下代码,将会对所有提交的framework进行设置:

post_install do |installer|
  installer.pods_project.targets.each do |target|
  target.build_configurations.each do |config|
  config.build_settings['SWIFT_VERSION'] = '3.0'
  end
 end
end

如下图:
pod设置
四、OC引用Swift的framework:
配置方法跟pod配置版本号方法相同,设置完版本号后在需要的文件中引用:#import <framework/framework-Swift.h>】也可以通过引入模块的方式:@import framework;这两种方式效果相同。
注意:很多swift三方库,并不支持OC使用,而绝大部分OC库支持swift,是向下兼容的,OC与Swift混编的注意事项,稍后补充。
ps:文章有点啰嗦,本人系新手,主要是记录给自己看。

2015-12-20 15:33:22 wj610671226 阅读数 889
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

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

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

总结一下自己对OC中和Swift中循环引用的认识。

一.OC中的循环引用分为类中的循环引用和对象之间的循环引用。

1.类的循环引用

造成原因: 在两个类的.h文件中使用了#import "<#header#>" 而造成两个类之间的循环引用

解决办法:在一个类的.h中使用#import "<#header#>",而在另外一个类中使用@class <#name#>;

2.对象之间的循环引用:即两个类的实例进行了相互指向,

如:

// 教室
ClassRoom * room = [[ClassRoom alloc] init];
// 学生
Student * stu = [[Student alloc] init];

// 设置引用关系
room.student = stu;
stu.classRoom = room;

一个教室里面有学生,一个学生存在于一个教室里面。

解决办法:1.一个类里面的属性使用强引用,另一个类中的属性使用弱引用

// 学生 若引用
@property (nonatomic, assign) Student * student;
// 教室 强引用</span>
@property (nonatomic, strong) ClassRoom * classRoom;

 如果两个属性都是使用的强引用Strong,则想要释放的时候,直接让某个属性等于nil,强制打破循环引用

stu.classRoom = nil;或者 room.student = nil;

3.Block中循环引用问题

在OC环境下Block引起的循环引用问题Xcode会给出一个警告提示

解决办法:


两种方法:建议使用第一种方法,后面一种是比较老得方法了,在使用过程中如果对象为空了,会引发程序崩溃。

二、Swift中的循环引用其实差不多,只是处理的语法不一样而已,关键是理解什么样的代码会造成循环引用。

1.对象之间的循环引用,直接上图

    

解决办法一

解决办法二

运行效果:

2.闭包引起的循环引用

引起循环引用的代码:

解决办法:

OC Swift混编 记录

阅读数 27

OC项目使用swift

阅读数 880

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