在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言SWIFT( 雨燕 ), 这个消息会前没有半点风声的走漏。消息发布当时,会场一片惊呼,相信全球看直播的码农们当时也感觉脑袋被敲了一记闷棍吧( 至少我当时是这样的,连喊三声:“卧槽,妈蛋” )。于是熬夜学习了SWIFT大法,越看越想高呼 ” SWIFT大法好!“ [rect setX:10 y:20 width:100 height:500] 看看!多棒!swift当然不会丢弃这么好的传统, 在swift中是这个样子的 fun( 11, 22 , 33 ) //正确 fun( n1:11, n2: 22, n3: 33 ) //错误 2: ) 类的函数,第一个参数不可以加标签 。 rect.set( 100, y:100, width:300, height: 200 ) //正确 rect.set( x:100, y:100, width:300, height: 200 ) //错误 其实swift中对类的定义和java, c#几乎一样,再也不分头文件和.m文件了。 class Weapon { var name:NSString var power:int init( name:NSString, power:int ) { self.name = name self.power = power } func shoot( ) } 注意:swift中的语句不需要分号结束( swift在吸引幼齿入swift大法方面无不用其极!)
@interface Weapon -(void)shoot; @end @interface Gun : Weapon -(void)Shoot; @end 在大项目中经常会遇到这个问题,程序员的本意是希望覆盖父类的shoot ,结果手潮。。。。写成了Shoot , 这既没有语法错误,也没有逻辑错误,结果在 override func shoot{ } 这样,编译器一看方法前写了override, 它就会在父类中去查找是否有shoot方法, 如果你写错成override func Shoot, 那编译器就立刻能发现报错啦! 在这里强调两点: 1:)swift其实就是objective-c的文本变种,对于这门全新的语言,苹果做的工作其实远没有我们想像的艰巨。LLVM编译器做工作只是先把swift翻译成objctive-c代码,然后再把objective-c代码翻译成c语言代码,然后再把c语言代码翻译成汇编,最终翻译成机器码。至于为什么编译器厂商这么绕,不直接把自己的语言翻译成汇编和机器码,那是由于现有的语言编译器(objective-c, c )已经非常成熟,而高级语言间的文本转换开发成本和维护成本都极其小。swift为什么要翻译成objective-c,是由于swift仍然需要objective-c中辛苦构建的ARC,GCD 等环境。 var n = 22
对于编译器而言,既然你都初始化为22了,它当然明白n是int , 你都打回车了, 它当然知道这是语句的结束,所以LLVM毫无压力的把它翻译成 int n = 22; 当然对于多个语句放一行,那编译器就没有办法了, 你还是要用分号来结束语句。如果没有初始化,你也可以手工指定变量类型 var n = 22; var hero:Hero
所以看上去是无类型变量,实质上还是强类型的( 编译器给你做了 ) let PI = 3.1415926
这里的PI 就是常量, 现在想想,以前的强类型高级语言真是傻到无语啊,let PI = 3.1415926 , PI 都这么明显是个double, 为啥还要程序员再写double ?! 调用: test( 25 , 100 ) //注意:全局函数的调用,参数不能加标签 func add( p1: Int32, p2 : Int32 )->Int32 { return p1+p2 } 3:)类的定义 class Person { var name:String var age = 0 init( name:String , age:Int32 ) { self.name = name; self.age = age; } func description( )->String { return “Name:\( self.name ) ; Age: \( age )”; } } 注意终于有构造函数了!!init 是系统自动调用的, 不需要程序员手工调用。所以它写起来和普通函数也有区别,前边不能加func。 编译器为什么要这样做?因为如果init也允许前面加上func, 万一程序员不小心把init函数名写错了, 写成func Inot( ),编译器就完全不知道它是程序员想写的构造函数。现在构造函数前不加func , 如果你写成Inot( ) 。 编译器一看前面没有func知道你要写构造,可函数名又不是init, 编译器就知道你不小心写错了就可以立刻报错啦!! int FindScoreByName( DataSource* source, string* name ); 问题来了,如果“jack.xu”的学员根本不存在,应该返回啥? 返回0?那肯定不对,因为0有可能也是学员的成绩。当然,如果返回的是类的对象,直接返回 NULL , 调用者就知道没有找到,现在是基本数据类型,返回NULL 其实就是0,怎么办?(在c,c++中的规范做法是 返回bool表示是否找到,而成绩通过形参来传递 ,其他高级语言中可以封装一个小类/包裹类 ) var n : UInt ? = 5 或 var n ? = 5 这里的?表示n 是个可选变量, 也就是说 n 有可能不存在, 什么情况下n不存在呢? 如果你这样写: var n : UInt ? 此外,需要注意的是swift语法中,nil 并不是0 , 而是一个NilType类型的变量 |
请发表评论