ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
一:如何去学习?都去学习什么?
1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计思想,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中,每行代码都要用心去写,每一行代码都要力求使最简洁的
3:学习别人遇到问题是如何分析问题,解决问题的方法是什么
4:遇到新东西应该如何去学习:1:先研究要学习的东西作用是什么 ,有什么好处 2:如何使用:具体的语法知识 ,参照苹果的API 3:使用场景:一般在项目中有什么应用。
5:最重要的就是花大量的时间研究优秀的代码,比别人想的深比别人想的远,注意每一个细节,把每一个细节都要搞懂,把每一个细节做到极致,花大量的时间去实践练习,将学习到的知识应用于项目中。
二:nullable, nonnull,null_resettable,_Null_unspecified 的关键字的认识
/* 1:介绍
怎么去研究新特性? 1.使用新的xcode创建项目,用旧的xcode去打开
Xcode7 2015 iOS9
Xcode6 2014 iOS8
Xcode5 2013 iOS7
Xcode4 2012 iOS6 1.出了哪些新特性 iOS9:关键字:可以用于属性,方法返回值和参数中
关键字作用:提示作用,告诉开发者属性信息
关键字目的:迎合swift,swift是个强语言,swift必须要指定一个对象是否为空
关键字好处:提高代码规划,减少沟通成本
关键字仅仅是提供警告,并不会报编译错误
*/ /* 2:nullable:
nullable:1.怎么使用(语法) 2.什么时候使用(作用)
nullable作用:可能为空 nullable 语法1
@property (nonatomic, strong, nullable) NSString *name; nullable 语法2 * 关键字 变量名
@property (nonatomic, strong) NSString * _Nullable name; nullable 语法3
@property (nonatomic, strong) NSString * __nullable name; */ /* 3:nonnull
nonnull:1.怎么使用(语法) 2.什么时候使用(作用)
nonnull作用:不能为空 nonnull 语法1
@property (nonatomic, strong, nullable) NSString *name; nonnull 语法2 * 关键字 变量名
@property (nonatomic, strong) NSString * _Nonnull name; nonnull 语法3
@property (nonatomic, strong) NSString * __nonnull name; */ /*
4:null_resettable: null_resettable:1.怎么使用(语法) 2.什么时候使用(作用) null_resettable:必须要处理为nil情况,重写get方法 null_resettable作用:get方法不能返回nil,set可以传入为空 null_resettable 语法1
@property (nonatomic, strong, null_resettable) NSString *name; - (NSString *)name
{
if (_name == nil) {
_name = @"";
}
return _name;
} */ /*
5:_Null_unspecified:不确定是否为空
*/ /*
6:
1:关键字注意点
在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间默认是nonnull,一般前者写在头文件之下,后者写在end之上 2:关键字不能用于基本数据类型(int,float),nil只用于对象 3: @property (nonatomic) NSString *name;如此写法,默认为strong修饰的
*/ #import "ViewController.h" @interface ViewController () // nonnull
// 没有处理为空的情况
@property (nonatomic, strong, nonnull)NSString *name; @end @implementation ViewController //- (UIView *)view
//{
// if (_view == nil) {
// [self loadView];
// [self viewDidLoad];
// }
// return _view
//} - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. } @end
三:泛型
#import "ViewController.h" /*
1:泛型介绍 泛型:限制类型
为什么要推出泛型?迎合swift
泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西
泛型定义用法:类型<限制类型>:NSMutableArray<NSString *> *arr,数组里存放的都是字符串类型 2:类的泛型声明: 泛型声明:在声明类的时候,在类的后面<泛型名称>:@interface Person<ObjectType> : NSObject
泛型仅仅是报警告
泛型好处:1.从数组中取出来,可以使用点语法:数组中存放元素的类型为id类型, id是不能使用点语法,但是利用泛型,给其限制类型,则从数组中取出对象后,可以利用点语法
2.给数组添加元素,有提示 3: 泛型在开发中使用场景: 1.用于限制集合类型:(集合类包括NSArray和NSSet,两者用法相同,前者是有序的,而后者却是无序的) 为什么集合可以使用泛型?使用泛型,必须要先声明泛型? => 如何声明泛型
自定义泛型?
什么时候使用泛型? 2: 在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型 自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言
如果没有定义泛型.默认就是id 例如: 1;声明泛型
#import <Foundation/Foundation.h> @interface Person<ObjectType> : NSObject // 语言
@property (nonatomic, strong) ObjectType language; @end 2:使用: Java *java = [[Java alloc] init];
iOS *ios = [[iOS alloc] init]; // iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios; // Java
Person<Java *> *p1 = [[Person alloc] init];
p1.language = java; */ #import "Person.h"
#import "Java.h"
#import "iOS.h"
@interface ViewController () @property (nonatomic, strong) NSMutableArray<NSString *> *arr; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
Java *java = [[Java alloc] init];
iOS *ios = [[iOS alloc] init]; // iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios; // Java
Person<Java *> *p1 = [[Person alloc] init];
p1.language = java;
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{ } @end
四:泛型的协变和逆变
#import "ViewController.h" /* 1:
泛型:限制类型
为什么要推出泛型?迎合swift 泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西
泛型定义用法:类型<限制类型>
泛型声明:在声明类的时候,在类的后面<泛型名称>
泛型仅仅是报警告
泛型好处:1.从数组中取出来,可以使用点语法
2.给数组添加元素,有提示 泛型在开发中使用场景:1.用于限制集合类型 id是不能使用点语法 为什么集合可以使用泛型?使用泛型,必须要先声明泛型? => 如何声明泛型 自定义泛型?
什么时候使用泛型?在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型 自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言
如果没有定义泛型.默认就是id 用于父子类型转换
泛型:__covariant:协变, 子类转父类 :也就是将子类的指针赋值给子类 __contravariant:逆变 父类转子类:也就是将父类的指针赋值给子类 泛型注意点:在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果,只是提示的作用 2:继承:子类继承父类后,父类可在.h中暴露方法例如初始化方法供子类去继承 1:父类只暴露了初始化方法没有重写,子类继承后,子类可以重写,(子类在重写时,尽量用self,不要用类名,避免其他类在继承该类的时候,初始化得到的都是该类的对象,而不是继承的子类的对象。)那么子类重写后,在父类中的self就为子类的对象,其中多个子类继承同一个父类的时候,父类可以提供一个get的标识方法供子类重写返回标识,从而在父类中来区分不同的子类 2:父类提供方法,供子类继承,父类在实现该方法,则子类在外部调用初始化方法的时候,就会调用父类中实现的初始化方法。(新浪参数模型抽父类继承的例子),若是子类又重写父类的初始化方法,调用super会执行父类的方法,否则就不会执行父类的方法,会覆盖掉父类的方法,只保留子类的方法 */ #import "Person.h"
#import "Java.h"
#import "iOS.h"
@interface ViewController () @property (nonatomic, strong) NSMutableArray<NSString *> *arr; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; [_arr addObject:@""];
// _arr = @[@"213",@"213",@1];
// Do any additional setup after loading the view, typically from a nib. iOS *ios = [[iOS alloc] init];
Language *language = [[Language alloc] init]; // 父类转子类
Person<Language *> *p = [[Person alloc] init];
p.language = language; // iOS
Person<iOS *> *p1 = [[Person alloc] init];
p1 = p; }
// 子类转父类
- (void)covariant
{
iOS *ios = [[iOS alloc] init];
Language *language = [[Language alloc] init];
// iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios; // Language
Person<Language *> *p1;
p1 = p; } - (void)test
{
Java *java = [[Java alloc] init];
iOS *ios = [[iOS alloc] init]; // iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios; // Java
Person<Java *> *p1 = [[Person alloc] init];
p1.language = java; } @end
五:__kindof
#import "ViewController.h"
#import "SubPerson.h" /*
kindof:相当于 __kindof:表示当前类或者它的子类', 类设计历史 id:可以调用任何对象方法,可以作为参数或是返回值,不能进行编译检查
instancetype:自动识别当前类的对象,只能作为返回值不能作为参数,自动返回与当前类类型相同的对象
*/ @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
/**
* 当父类提供初始化的方法的时候,子类继承了父类的方法,若是子类SubPerson调用父类的初始化方法:person,则返回的是父类对象的类型,会出现警告,这时,可以在父类中定义的初始化方法用__kindof来修饰,表示当前类或是其子类。+ (__kindof Person *)person; */
SubPerson *p = [SubPerson person]; } @end
ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof的更多相关文章
- iOS9新特性之泛型
iOS9新特性之泛型 作用:限制类型 好处:1.提高开发规范,减少程序员之间的交流 2.通过集合取出来的对象,直接当作泛型对象使用,可以直接使用点语法(id类型不能使用点语法) 使用场景: 1.在集 ...
- fir.im Weekly - 从 iOS 10 SDK 新特性说起
从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK ...
- iOS9新特性——堆叠视图UIStackView
一.引言 随着autolayout的推广开来,更多的app开始使用自动布局的方式来构建自己的UI系统,autolayout配合storyBoard和一些第三方的框架,对于创建约束来说,已经十分方便,但 ...
- IOS9新特性之Contacts联系人
在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用起来非常的难受.在iOS9中,apple终于解决了这个问题,全新的Contact ...
- iOS9新特性
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级 ...
- 了解iOS各个版本新特性总结
参考了一下的文章:https://blog.csdn.net/zxtc19920/article/details/54341836 iOS7新特性 · 在iOS7当中,使用麦克风也需要取得用户同意了. ...
- Atitit.业务系统的新特性 开发平台 新特性的来源总结
Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby go dart1 1.2. ...
- Xcode And iOS9新特性
Xcode And iOS9 1. Xcode7 新特性 > 可直接在真机上运行自己的应用,只需要有苹果账号,无需购买苹果开发者账号. > 可设置在出现 EXC_BAD_ACCESS 错误 ...
- 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
随机推荐
- 从”茄子快传”看应用程序怎样获取手机已安装程序的apk文件
"茄子快传"是联想开发的一款近距离文件共享软件.它通过wifi-direct(速度飞快,不须要联网)或者普通的网络(速度慢)在不同手机间传递文件. 不知为何.它就火了起来,火的也飞 ...
- 没有killall命令的解决方法
没有killall命令的解决方法 -bash: killall: command not found https://www.byte128.com/archives/231.html 执行killa ...
- 如何创建Hiren的BootCD USB磁盘 -- 制作U盘启动盘
如何创建Hiren的BootCD USB磁盘 原文 https://www.wintips.org/how-to-create-hirens-bootcd-usb-disk/ 本文基本是谷歌翻译 H ...
- 外部事件触发调用对象方法时this指向问题
问题如下: var obj = { name: 'dang', test:function(){ alert(this.name); } }; obj.test(); //这样是可以的 $('.box ...
- 设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)
依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码 ...
- C++ 学习路线推荐
相信有非常大一部分学计算机的童鞋都是靠自学,即使本身是计算机专业的同学,也会认为只通过课堂上的学习是远远不够的,并且在上课时所用到的教材也不够好.然而自学的时候有个非常大的问题就是找不到合适的 ...
- diff命令具体解释
diff命令參数: diff - 找出两个文件的不同点 总览 diff [选项] 源文件 目标文件 以下是 GNU所接受的 diff 的全部选项的概要. 大多数的选项有两个同样的名字,一个是单个的跟在 ...
- ORACLE10g R2【RAC+ASM→单实例FS】
ORACLE10g R2[RAC+ASM→单实例FS] 10g R2 RAC+ASMà单实例FS的DG,建议禁用OMF. 本演示案例所用环境: primary standby OS Hostnam ...
- TOMCAT8009端口与AJP13协议
Tomcat最主要的功能是提供Servlet/JSP容器,尽管它也可以作为独立的Java Web服务器,它在对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能方面都不如其 ...
- OC的DES加密,使与java的Cipher类用DES/CBC/PKCS5Padding方式的加密结果同样
问题说明: 近期用到DES加密,而且要与java的Cipher类加密的结果保持一致.没研究过java的Cliper,但工作中Cipher依据DES/CBC/PKCS5Padding加密方式生成了一个字 ...