Swift与OC的区别

Swift与OC的区别

1、基础篇

Swift与OC的区别_第1张图片
Swift---OC


2、监听方法

OC      使用 @selector(actionName)

Swift   直接使用字符串,提示:可以先用智能提示敲出方法名,然后增加引号

oc

-(void)test{

           UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

          [button addTarget:self action:@selector(didClick:) forControlEvents:UIControlEventTouchUpInside];

}

-(void)didClick:(UIButton*)button{

}

swift

override func viewDidLoad() {

        // 创建按钮

         let  btn =UIButton(type:UIButtonType.ContactAdd)        

         v.addSubview(btn)

        // 监听方法

        btn.addTarget(self, action:"clickButton", forControlEvents: .TouchUpInside)   

 }

func  clickButton(btn: UIButton){

        print(__FUNCTION__)

         print(btn)  

  }

如果有参数直接增加 ':'


3、常量与变量声明

oc的变量声明使用  类型 变量名 = 变量值的方式,其中类型为系统内置数据类型或自定义类型,变量名需由英文字母开头且不能包含特殊字符

swift变量声明使用 var 变量名 = 变量值的方式,其中变量名可以使用任何你喜欢的字符,甚至是表情符号emoji等

oc常量声明使用const放在变量定义前即为声明常量,如:const NSString *str = @"Hello";

swift常量声明使用 let 常量名 = 常量值的方式,同样可以使用任何你喜欢的字符作为常量名

swift 可以自动推断出常量与变量的数据类型,当然也可以使用“:数据类型”的方式指定其具体数据类型,如 let age:Int = 10

PS:swift严格要求变量在使用前必须进行初始化,如上所示,必须给定变量值,而oc则不强制


4、属性和变量(propertry,variable)

在OC中使用属性一般都使用如下格式:

           @property (strong,nonatomic) NSString *string;

而在Swift中的属性一般都使用如下格式:

           class Shape { var name = "shape"}

在oc中可以直接与变量打交道,swift中则行不通,在Swift的世界里,我们只与property打交道。在Swift中,属性分为存储属性和计算属性。简单来说,就是存储属性能够保存值,而计算属性只提供getter与setter,利用存储属性来生成自己的值。计算属性更像方法,而不是传统意义的属性。但是这样一个特性存在,使得我们更容易组织我们的代码。

构造变量

              在OC中,只能通过单例,或者static变量加类方法来构造类变量:

@interface Model

+ (int) value;

+ (void) setValue:(int)val;

@end

@implementation Modelstatic

       int value;

      + (int) value{

@synchronized(self) {

       return value;

}

+ (void) setValue:(int)val{

       @synchronized(self) {

                value = val;

}

}

@end

// Foo.h@interface Foo {}

+ (NSDictionary *) dictionary;

// Foo.m oc单例

+ (NSDictionary *) dictionary{

       static NSDictionary* fooDict = nil;

        static dispatch_once_t oncePredicate;

        dispatch_once(&oncePredicate, ^{

         // create dict

        });

        return fooDict;

}

               在swift中,可以通过清晰的语法便能定义类变量,通过static定义的类变量无法在子类重写,通过class定义的类变量则可在子类重写。

struct SomeStructure {

         static var storedTypeProperty = "Some value."

         static var computedTypeProperty: Int {

         return 1

         }

        class var overrideableComputedTypeProperty: Int {

                   return 107

         }

}

//swift单例

class singletonClass {

          static let sharedInstance = singletonClass()

           private init() {} 

         // 这就阻止其他对象使用这个类的默认的'()'初始化方法

}


5、控制语句

分支语句: if,switch和guard(新增)

if后面的语句必须为bool类型,可以不加括号

switch 可以支持Int,Float,Double,String,Tuple等AnyObject,无需break

guard 是Swift2.x新增关键字,必须配合else使用,解决if-else多层嵌套问题,判断一个条件为true下执行某语句,否则终止或跳转执行其他语句

循环语句: while, repeat-while,for(改动),for-in

for循环 摒弃掉了c的style,一律以...来替代,不得不说很赞。

for i in 1...arr.count{

//循环体

}

swift专门提供了遍历集合的方法for-in

let numbers = [1,2,3,4,5,6,7,8,9,10]

for (index,element) in numbers.enumerate(){

print("Item \(index) : \(element)")    //index和item都有了

}

swift中的for循环提供了类似NSRange方式的跨步查找方式

for index in stride(from: 1, through: 5, by: 2) { print(index)}

跳转语句: break,continue,fallthrough(新增),return,throw(新增)

fall through 是贯通语句,只能在switch中使用,如果一个case执行完毕,需要执行另一个case,则需要用fallthough跳转至下一个case

throw 在oc中的NSError一定很熟悉了,在swift里,借助java的try..catch语句可以将程序中抛出(throw)的异常收集起来。

值绑定: 常用于if,guard,switch,where

在控制语句中将表达式的值临时赋给一个常量或者变量,这些常量或者变量可以在该控制语句中使用,称为"值绑定"。

where语句类似于sql中的where语句,非常好用。

//switch中使用元祖类型

var student = (id:"1002",name:"李四",age:32, ChineseScore:80, EnglishScore:89)

var desc: String

switch student {

case (_, _, _, 90...100, 90...100) where age > 20:  //where语句

desc = "优"

case (_, _, _, 80...90, 80...90):

desc = "良"

case (_, _, _, 60...80, 60...80):

desc = "中"

case (_, _, _, 60...80, 90...100), (_,_, _, 90...100, 60...80):

desc = "偏科"

case (_, _, _, 0...80, 90...100), (_,_, _, 90...100, 0...80):

desc = "严重偏科"

default:

desc = "无"

}

print("说明:\(desc)")

你可能感兴趣的:(Swift与OC的区别)