Swift与OC的区别
1、基础篇
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)")