iOS-Object-C和Swift语言的区别

1.常见不同之处

参考swift和OC的区别

1.swift句尾的分号可以省略,除非你想在一行中写多行代码需要加分号隔开;
2.swift不需要写main函数,程序默认从上往下执行;
3.swift不再有地址的概念;
4.swift不分.h和.m文件,每个类只有一个.swift文件;
5.swift会自动判断数据类型,只区分变量var和常量let;

6.swift强制转换:int(a);
7.整数的数据类型可以通过.min和.max获得最大和最小值;
8.定义类型的别名 语法改变 OC:typedef integer myInteger swift: typealias myInteger=integer;
9.swift里取余操作支持小数,如 4%0.6 = 0.4;
10.swift里true为真,false为假,而OC里非0即是真;

11.swift的赋值运算符没有返回值;
12.swift可以多对多赋值,如 let(a,b)=(3,4);
13.swift的循环语句中必须加{},就算只有一行代码也要加;
14.swift的switch case语句可以跟各种数据类型,如浮点数,字符串, 并且里面不用写break;
15.swift有范围运算符,如a...b表示[a,b], a..<b表示[a,b),而且可以直接写在for-in循环中;

16.swift独有移除运算符&+, &-,&*,&/,&%;
17.swift独有元组类型,如 var point = (x:0,y:64), 取出x:point.x = 0, 取出y:point.1(或者point.y)=64,初始化的时候可以用下划线省略不需要的元素,如var point = (5, _);
18.swift中,switch语句使用元组类型时,可以用类似SQL语句的语法 添加过滤条件

switch point {
    case let(a,b) where a == b:
    printIn("a等于b");
}

19.swift的外部参数名:func Sum(numone num1:Int,numtwo num2:Int) -->Int{},调用时写 Sum(numberone:1, numbertwo:2);或者让外部参数名和内部参数名一样:func Sum(#num1:int, #num2:int) -->Int{},调用时写Sum(num1:1, num2:2);

20.swift中函数的默认参数值

func addPerson(name:String, age:Int=27) -->string{},
addPerson("dingding")  //设置默认年龄为27,调用时:
addPerson("dingding",age:33) //如果想改默认参数,需要这样写
2. Swift和OC的区别(基于Swift3.0)

参考Swift和OC的区别(基于Swift3.0)

2.1 基础部分

1.Swift还增加了Objective-C中没有的类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。

let http404Error =(404,"Not Found")
//元组(tuples)把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。

2.Swift还增加了可选(Optional)类型,用于处理值缺失的情况。可选表示“那儿有一个值,并且它等于x”或者“那儿没有值”。可选有点像在Objective-C中使用nil,但是它可以用在任何类型上,不仅仅是类。可选类型比Objective-C中的nil指针更加安全也更具表现力,它是Swift许多强大特性的重要组成部分。

Swift定义的常量和变量是没有默认值的,所以引入了可选的概念,用?修饰变量,标示该变量的值可能为空也可能为某个值,然后获取的时候用!强制解析,此时必须有值,否则报运行时错误

var str:String?
str="ass"
if let realstr = str {
    print("realstr=\(realstr)")
}else{
    print("str为空")
}

3.常量的值一旦设定就不能改变,而变量的值可以随意更改。常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。

4.Swift中整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,并且都是以结构体的形式在后台所实现。

5.类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用typealias关键字来定义类型别名。

typealias AudioSample = UInt16
varmaxAmplitudeFound = AudioSample.min

6.控制流

//传统获取index的语法
for i in 0…10 {
}
//快速访问对象的语法
for obj in arr {
}
2.2 函数

1.可以给参数添加默认值,使用时也可以不传此参数

func add2(param1:String,param2:String="q")->String  {
    return param1+param2
}
print(add2(param1: "w"))
  1. inout修饰函数参数

变量形参只能在函数本身内改变。如果你想让函数改变形参值,并想要在函数调用结束后保持形参值的改变,那你可以把形参定义为in-out形参。

func change(param:inout String)  {
    param="wowo"
}
var kaka:String="kaka"
change(param: &kaka)
print(kaka)//此时kaka=“wowo”
2.3 类

1.属性
lazy修饰的属性必须初始化它会在使用该属性的时候才去执行初始化的代码一般用在消耗不少时间的变量上比如文件打开

lazy特性;局部范围的常量或变量不会延迟计算。

  1. set get方法
var firstName:String
{
    get  {
        return "first"+self.name!
    }
    //newValue代表set参数值
    set  {
        self.name="setName:"+newValue
    }
}
  1. 属性监视器

willSet didSet方法
willSet在设置新的值之前调用
didSet在新的值被设置之后立即调用

//需要设置默认值
var idcard:Double = 0.0    {

    willSet  {
        print("willSet")
    }

    didSet  {
        print("didSet")
    }
}
4. 继承

如果子类实现和父类相同的方法或者属性就是重写。必须用overriding关键字表明。

重写overriding方法

class Student: Person {
    override func sayHello(mes: String)-> String {
        //可以使用super关键字调用父类方法
        return super.sayHello(mes:mes)
    }
}

重写overriding属性

override var name: String?  {

    set  {
    }

    get  {
        return super.name
    }
}

原则:你可以将一个继承来的只读属性重写为一个读写属性,只需要你在重写版本的属性里提供getter和setter即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。

防止重写

你可以通过把方法,属性或附属脚本标记为final来防止它们被重写

5.构造方法

与Objective-C中的构造器不同,Swift的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。

构造器分位指定构造器和便利构造器

原则:指定构造器是向上调用的,便利构造器是横向调用的.
规则1:指定构造器必须调用其父类的指定构造器
规则2:便利构造器必须调用同一类中调用的其他构造器
规则3:便利构造器必须以调用一个指定构造器结束

//指定构造器(默认构造方法),因为父类也有该方法,所以用override
override init()  {
    super.init()
    print("Student init")
}

//指定构造器(自定义构造方法,父类没有该方法,不需要override)
init(size:Double)  {
    super.init(size: size)
    print("Student init with size")
}

//便利构造器(使用关键词convenience,需要调用自己的构造方法)
convenience init(size:Double,friendNums:Double)  {
    self.init(size:size)
    self.friendNums=friendNums
}
6. 类扩展

相当于OC分类

Swift中的扩展可以:

1.添加计算型属性和计算静态属性

注意:扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(property observers)

2.定义实例方法和类型方法

3.提供新的构造器

4.定义下标

5.定义和使用新的嵌套类型

6.使一个已有类型符合某个接口

7. 自动引用计数

总体基本和oc一致,在解决循环引用的问题有点区别。

可以使用弱引用weak和无主引用unowned修饰一方变量。

7.1 两个属性的值都可能是nil,并有可能产生强引用环。这种场景下适合使用弱引用。
var a:A?
weak b:B?
7.2 一个属性可以是nil,另外一个属性不允许是nil,并有可能产生强引用环。这种场景下适合使用无主引用。
var a:A?
unowned b:B

override init(){
    self.b=B()
}
7.3 两个属性都必须有值,且初始化完成后不能为nil。这种场景下,则要一个类用无主引用属性,另一个类用隐式展开的可选属性。
var a:A!
override init(){
    self.a=A()
}

unowned b:B
override init(){
    self.b=B()
}
8. 类型转换
8.1 检查类型

用类型检查操作符(is)来检查一个实例是否属于特定子类型。类型检查操作符返回true若实例属于那个子类型,若不属于返回false。

library中添加Movie和Song

for  item  in  library {

    if  item is Movie {

        ++movieCount
    }else  if  item is Song {

        ++songCount
    }
}
8.2 向下转型(简称下转)

某类型的一个常量或变量可能在幕后实际上属于一个子类。你可以相信,上面就是这种情况。你可以尝试向下转到它的子类型,用类型转换操作符(as)

如果强制转型肯定成功,可以使用as!,如果使用as?,那么返回结果成功则为该转的类型,失败则为空,此时可以使用if let来接收判断

8.3 Any和AnyObject的转换

Swift为不确定类型提供了两种特殊类型别名:

  1. AnyObject可以代表任何class类型的实例。

  2. Any可以表示任何类型(基础类型和class类型),除了方法类型(function types)。

9. 闭包

Swift中的闭包与C和Objective-C中的blocks有点类似。

闭包表达式语法

{(parameters)-> returnTypein
    statements
}

捕获

闭包可以在其定义的上下文中捕获常量或变量。即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。

//makeIncrementor函数返回值是一个()->Int类型的函数

func makeIncrementor(amount: Int)->()-> Int {

    var runningTotal = 0

    func incrementor()-> Int {
        runningTotal += amount
        return runningTotal
    }

    return incrementor
}

//闭包捕获amount参数的值,然后每次都可以使用

let incrementByTen = makeIncrementor(amount: 10)

print(incrementByTen())//10
print(incrementByTen())//20
print(incrementByTen())//30
10. 应用

swift读取文件为String类型

let path:String = Bundle.main.path(forResource: "demo2.js",ofType:nil)!

if let spath = try?String.init(contentsOf: URL.init(fileURLWithPath: path),encoding:String.Encoding.utf8)  {

}  else  {

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容