余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

iOS:OC开发中的写法与Swift中写法的对比(oc和swift哪个常用)

xiyangw 2022-12-03 13:03 20 浏览 0 评论

我相信大家从OC转到Swift的时候总会有这个困惑“以前在OC这样用,Swift该怎么写?”

多的不说了往下看。

1.懒加载

  • OC:

    -(UITableView *)tableView{ if (_tableView == nil) { UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];

    _tableView = tableView;

    _tableView.dataSource = self;

    _tableView.delegate = self;

    _tableView.backgroundColor = [UIColor grayColor];

    } return _tableView;

    }

  • Swift

    在定义时 增加lazy关键字

    lazy var tableView = UITableView()

    也可以这样

    lazy var tableView: UITableView = { [weak self] in

    let tableView = UITableView()

    tableView.frame = (self?.view.frame)!

    tableView.backgroundColor = UIColor.black

    return tableView

    }()

    但是不建议使用第二种方法,因为第二种方法是一个闭包,很容易循环引用,使用[weak self]又得考虑解包的问题,推荐第一种写法。

2.重写属性setter方法

  • OC

    在用OC开发的时候经常会重写某个属性的setter方法来给子控件赋值

    -(void)setMeMenu:(MeMenu *)meMenu{

    _meMenu = meMenu; self.nameLabel.text = meMenu.name; self.iconView.image = [UIImage imageNamed:meMenu.iconName];

    }

  • Swift

    在定义属性时增加didSet

    PS:没有智能提示

    var meMenu: meMenu?{

    didSet{

    nameLabel.text = meMenu!.name;

    }

    }

3.重写frame的setter方法

  • OC

    在OC开发中大家都有过重写cell frame的需求

    -(void)setFrame:(CGRect)frame

    {

    frame.origin.y += 10;

    frame.size.height -= 10;

    [super setFrame:frame];

    }

  • Swift

    override var frame:CGRect{

    didSet {

    var newFrame = frame

    newFrame.origin.x += 10

    newFrame.size.width -= 10 * 2

    newFrame.origin.y += 10

    newFrame.size.height -= 10 * 2

    super.frame = newFrame

    }

    }

4.字典转模型

  • OC

@implementation MeMenu-(instancetype)initWithDic:(NSDictionary *)dic{ self = [super init]; if (self) { self.iconName = dic[@"icon"]; self.name = dic[@"name"];

} return self;

}

+(instancetype)initWithDic:(NSDictionary *)dic{ return [[self alloc]initWithDic:dic];

}

+(NSMutableArray *)meMenus{ NSString *path = [[NSBundle mainBundle] pathForResource:@"dataArr" ofType:@"plist"]; NSArray *arr = [NSArray arrayWithContentsOfFile:path]; NSMutableArray *arrs = [NSMutableArray array]; for (NSDictionary *dic in arr) {

[arrs addObject:[MeMenu initWithDic:dic]];

} return arrs;

}@end

  • Swift

    class MeMenu: NSObject { var name: String? var type: String? var detail: String? var icon: String? init(dic: [String: String]) { super.init()

    setValuesForKeys(dic)

    } //外面调用这个类方法

    class func meMenus() -> Array<Any>{ let arrDic = NSArray(contentsOfFile: Bundle.main.path(forResource: "DoctorList.plist", ofType: nil)!)! var arrayM = Array<MeMenu>() for dic in arrDic { let doctor = MeMenu(dic: dic as! [String : String])

    arrayM.append(doctor)

    } return arrayM

    }

    }

5.Swift的extensionconvenience关键字

extension(扩展) 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )。扩展和 Objective-C 中的Category(分类)类似。(与 Objective-C 不同的是,Swift 的扩展没有名字。)

Swift 中的扩展可以:

添加计算型属性和计算型类型属性

定义实例方法和类型方法

提供新的构造器

定义下标

定义和使用新的嵌套类型

使一个已有类型符合某个协议

在 Swift 中,你甚至可以对协议进行扩展,提供协议要求的实现,或者添加额外的功能,从而可以让符合协议的类型拥有这些功能。你可以从协议扩展获取更多的细节。

注意

扩展可以为一个类型添加新的功能,但是不能重写已有的功能。

  • 使用extension分割代码

    可以让代码更易阅读与修改

class DempViewController: UIViewController {

lazy var tableView = UITableView() override func viewDidLoad() { super.viewDidLoad()

setupUI()

}

}// MARK: 设置界面extension DempViewController{

fileprivate func setupUI(){

tableView.dataSource = self

tableView.delegate = self

tableView.frame = view.bounds

}

}// MARK: 表格的数据源方法extension DempViewController: UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 2

} func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "id", for: indexPath) return cell

}

}// MARK: 表格的代理方法extension DempViewController: UITableViewDelegate{

}

  • 使用convenience便利构造器快速创建控件

    • 新建 UIButton+Extension.swift 文件

    • 建立 UIButton 的便利构造函数

      extension UIButton {/// 快速创建按钮/// - parameter title: title/// - parameter imageName: imageName/// - parameter backImageName: backImageName////// - returns: UIButtonconvenience init(title: String, imageName: String, backImageName: String) { self.init()

      setTitle(title, for: .normal)

      setImage(UIImage(named: imageName), forState: .Normal)

      setImage(UIImage(named: imageName + "_highlighted"), forState: .Highlighted)

      setBackgroundImage(UIImage(named: backImageName), forState: .Normal)

      setBackgroundImage(UIImage(named: backImageName + "_highlighted"), forState: .Highlighted)

      }

      }

      注意:便利构造器必须先调用self.init()而且没有智能提示~

开发中多利用extension分割代码、抽取常用代码

  • OC中的Category

文/SoolyChristina(简书作者)

简书文章作者不定期的更新较有质量的干货,大家可以关注下

原文链接:http://www.jianshu.com/p/08fb33a346c6

相关推荐

前后端分离 Vue + NodeJS(Koa) + MongoDB实践

作者:前端藏经阁转发链接:https://www.yuque.com/xwifrr/gr8qaw/vr51p4写在前面闲来无事,试了一下Koa,第一次搞感觉还不错,这个项目比较基础但还是比较完整了,...

MongoDB 集群如何工作?

一、什么是“MongoDB”?“MongoDB”是一个开源文档数据库,也是领先的“NoSQL”数据库,分别用“C++”“编程语言”编写,使用带有“Schema”的各种类似JSON的文档,是也分别被认为...

三部搭建mongo,和mongo UI界面

三步搭建mongo,和mongoUI界面安装首先你需要先有一个docker的环境检查你的到docker版本docker--versionDockerversion18.03.1-ce,b...

Mongodb 高可用落地方案

此落地方案,用于实现高可用。复制集这里部署相关的复制集,用于实现MongoDB的高可用。介绍MongoDB复制集用于提供相关的数据副本,当发生硬件或者服务中断的时候,将会从副本中恢复数据,并进行自动...

一次线上事故,我顿悟了MongoDB的精髓

大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB分片的理论与实践,...

IDEA中安装MongoDB插件-再也无要nosql manager for mongodb

大家都知道MongoDB数据库作为典型的非关系型数据库被广泛使用,但基于MongoDB的可视化管理工具-nosqlmanagerformongodb也被用的较多,但此软件收费,所以国内的破解一般...

数据库监控软件Lepus安装部署详解

Lepus安装部署一、软件介绍Lepus是一套开源的数据库监控平台,目前已经支持MySQL、Oracle、SQLServer、MongoDB、Redis等数据库的基本监控和告警(MySQL已经支持复...

YAPI:从0搭建API文档管理工具

背景最近在找一款API文档管理工具,之前有用过Swagger、APIManager、Confluence,现在用的还是Confluence。我个人一直不喜欢用Swagger,感觉“代码即文档”,让代...

Mac安装使用MongoDB

下载MongoDB包:https://www.mongodb.com/download-center解压mongodb包手动解压到/usr/local/mongodb文件夹配置Mac环境变量打开环境...

保证数据安全,不可不知道的MongoDB备份与恢复

大家在项目中如果使用MongoDB作为NOsql数据库进行存储,那一定涉及到数据的备份与恢复,下面给大家介绍下:MongoDB数据备份方法在MongoDB中我们使用mongodump命令来备...

MongoDB数据备份、还原脚本和定时任务脚本

备注:mongodump和mongorestore命令需要在MongoDB的安装目录bin下备份脚本备份格式/usr/local/mongodb/bin/mongodump -h ...

等保2.0测评:mongoDB数据库

一、MongoDB介绍MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产...

MongoDB入门实操《一》

什么是MongoDBMongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之...

Python安装PyMongo的方法详细介绍

欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。前言本文主要给大家介绍的是关于安装PyMongo的...

第四篇:linux系统中mongodb的配置

建议使用普通用户进行以下操作。1、切换到普通用户odysee。2、准备mongodb安装包,自行去官网下载。3、解压安装包并重命名为mongodb4.04、配置mongodbcdmongod...

取消回复欢迎 发表评论: