技术开发 频道

环信隋云怡:移动开发之语言之美–类

  【IT168 资讯】现在最受开发者欢迎的两大平台 IOS, android现在主要还使用Objective-C 和 Java 来进行开发,不过苹果公司推出的编程语言 Swift,她吐故纳新,抛弃了Objective C繁琐的语法规则,引入了极为简洁,功能强大的语法。实际上除了平台本身的限制,包括如何调用平台提供的API,如何使用线程,如何启动定时器,如何设计UI界面等等之外,语言本身其实都是大同小异,所以为了方便开发者掌握不同平台的语言,对比学习Swift,Objective-C,Java等移动开发主流语言也是一种不错的选择。

  在这个篇章中,我们首先从类定义开始,逐步探讨继承,接口,访问控制

  如果你学过面向对象编程的语言,你就知道类是个什么概念,简而言之,我们把某种具有共同属性及功能单元的设计蓝图称之为类,它代表的设计定义,而对象就是根据类定义所产生的内存实体。

  我现在用一个简单的需求实例来阐明不同的语言是如何实现这个需求的,以便读者可以了解不同的语言是对类如何定义和实现的。

需求:

实现一个类

包含4个变量

1.mExampleData 是integer类型
2.mExampleStr是字符串类型
3.mExampleBool 布尔类型
4.exampleProperty 是int类型

但是exampleProperty是可以通过api进行改变的

包含5个函数

1.构造函数
2.exampleFunc函数没有任何返回值和参数
3.exampleFuncWithParameters 没有返回值但是有一个字符串参数,和 布尔型参数
4.exampleFuncWithReturnValue 返回值为字符,但没有参数的函数
5.classExampleFunc 静态或者类函数

Objective-C 定义

环信隋云怡:移动开发之语言之美 – 类

Objective-C 类实现

环信隋云怡:移动开发之语言之美 – 类

Swift

环信隋云怡:移动开发之语言之美 – 类

Java

环信隋云怡:移动开发之语言之美 – 类

属性property/成员变量

Objective-C既提供变量也提供属性的概念,实际上属性就是一种语法规则,属性本身并不存在内存中,但编译器为之合成一个内存实体叫_PropertyName,我们可以简单的理解为是用来替代麻烦的setter和getter操作,编译器会自动合成相应的setter和getter函数,不过属性定义的不同会导致setter和getter实现的不同。

为了简洁,去除混淆,Swift已经不再区分成员变量和property,她应经统一了二者,直接用关键字var来定义。

Swift 定义了两种property

Stored Property -- 可以理解为property直接存储数据

Computed Property -- 可以理解为property不能直接存储数据,而是通过getter,setter来间接存取

exampleProperty就是个Computed Property

环信隋云怡:移动开发之语言之美 – 类

example.exampleProperty 值为10

Java 和 Objective-c 还有 Swift不同之处就是,语言层面没有property的支持,不过无非就是多写两行代码,用来setter和getter成员变量

类函数/静态函数

直接了当的说,就是直接可以通过类名访问

环信隋云怡:移动开发之语言之美 – 类

类变量/静态变量

用来做所有实例共享的变量,单例模式

swift,和Objective-C不能声明类变量在类里,Java一定要声明在类里。

Objective-C

环信隋云怡:移动开发之语言之美 – 类

Swift

环信隋云怡:移动开发之语言之美 – 类

类属性,所有的实例都共享同一个类属性,类属性一定是个Computed Property(看上述property属性),类属性的实现需要全局属性的支持,上述就是如何定义一个全局属性来存储数据
类属性例子如下:

环信隋云怡:移动开发之语言之美 – 类

Java

环信隋云怡:移动开发之语言之美 – 类

接口,继承,重载

Swift

环信隋云怡:移动开发之语言之美 – 类

Objective-C

环信隋云怡:移动开发之语言之美 – 类

Java

环信隋云怡:移动开发之语言之美 – 类

三种语言都不支持多继承,但是都支持多接口实现。

关于重载只有Swift硬性要求在重载的函数前加override,否者complier会报错

构造函数

Swift和Objective-C的默认构造函数都是init(),并且可以定制的构造函,只不过名称都必须命名为init只是参数不同,Java和C++一样都是类名开始的函数,但init有返回值,Java构造函数没有。可以参考上面代码。

Java 和 Objective-C默认都会调用父类的构造函数,但swift则不同,默认不调用除非以下情况:

子类没有实现任何init构造函数

子类重载或新实现某些构造函数,但子类所有的property都必须要有默认的初始值,也就是在声明时赋的值

Swift 可以重载构造函数,不过必须要加override前缀

类探测API

Java:
用 instanceof 来探测类type

环信隋云怡:移动开发之语言之美 – 类

Swift:
用as来探测类type

环信隋云怡:移动开发之语言之美 – 类

Objective-C
用isKindOfClass来探测类type

环信隋云怡:移动开发之语言之美 – 类

访问控制
Objective-C

其访问控制基本和C++一致

@private:      只有这个类可以访问
@protected:  此类和子类可访问
@public:       任何类都可以访问

默认权限是protected

Swift:
private:        只有在本源文件里的代码可以访问
internal:       只有在本module(例如,app,或framework)里可以访问
public:         没有限制,可以作为对外暴漏的接口,例如创建个library

默认权限是internal

Java:
private:       只有这个类可以访问,不可跨包访问
default:       只有本包得类可以访问,默认的类都是default
protected:本类和此类的子类可以访问,跨包可访问
public:        没有限制,所有类可以访问,跨包可以访问

默认权限是default

此文主要讲解不同的语言对类不同的定义和实现,哪些地方不同并且应该注意什么,不过从结构来看,大体语言都很类似。此文并没有讲解的面面俱到,例如教大家如何熟悉语言的基本语法,如何声明变量,如何写控制流,这些都需要读者自己写程序加以熟悉。
由于时间有限,如果有纰漏之处,还望提醒,我会及时改正,谢谢。

下一篇,我会继续移动开发之语言之美 -- 设计模式。

PS:如果需要源码,请发信给mailto : syyorient@outlook.com

[Reference]
https://itunes.apple.com/cn/book/swift-programming-language/id881256329?mt=11
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/I

本文章版权归环信所有,转载请注明出处。更多技术文章请访问http://blog.easemob.com/

特别提醒:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
0
相关文章