What’s New in Swift
错误处理-Error Handle
由原来的error 改成try-catch 或者throws
之前 语法如下
var reg :NSRegularExpression! = NSRegularExpression(pattern: pattern,options: NSRegularExpressionOptions.CaseInsensitive,error@H_502_18@: &error@H_502_18@)
swift2改成try-catch 或throws。如下
do@H_502_18@{
let@H_502_18@ reg :NSRegularExpression! = try@H_502_18@ NSRegularExpression(pattern: pattern,options: NSRegularExpressionOptions.CaseInsensitive)
let@H_502_18@ resultCheck : NSTextCheckingResult! = reg.firstMatchInString(telNum!,options: NSMatchingOptions(),range: NSMakeRange(0@H_502_18@,Int(telNum!)!))
if@H_502_18@ resultCheck != nil {
flag = true@H_502_18@
}
} catch@H_502_18@ {
flag = false@H_502_18@
}
}
个人感觉仿佛又回到了大学时学java的时候了。。。
语法改进
引入关键词
do,guard,defer,and repeat
- 新的do语句:在do语句中支持代码块嵌套。但do-while被repeat-while取代,因为赋予了do其它的功能
- 新的guard语法:这个新的语法允许你在一个代码周期中构建一个提前的退出点。提前退出点:被用于退出代码块(和return、throw、break、continue等类似),或者终止调用一个@noreturn属性修饰的函数
例如
func processPerson(json: AnyObject)@H_502_18@ ->@H_502_18@ Either<Person,String> {
guard let@H_502_18@ name = json["name"@H_502_18@] as? String {
throw@H_502_18@ DataError.MissingName
}
guard let@H_502_18@ year = json["year"@H_502_18@] as? Int {
throw@H_502_18@ DataError.MissingYear
}
return@H_502_18@ .First(Person(name,year))
}
- 新的defer语句:这个语句在代码生命周期结束时用来做清理的工作,该特性在并发开发时使用新的错误处理模型时非常有用。
- 模式匹配的增强化:switch/case的模式匹配现在在很多新的条件流程控制语句中可用,这包括if/case,while/case,guard/case和for-in/case、for/in,同时也允许使用“where”判断。
- 诊断信息的增强化:增加了一个新的警告信息用来在尽可能的情况下鼓励使用let而不是var。同时也增加了新的警告信息来提示未使用的变量,无法触发的switch case分支判断等,同时对于switch语句耗尽的判断更加智能。
当接下来的语句中没有对变量做出更改都会提示let
关于选项集
之前是以“|”分割即位运算的方式
arrowImage.autoresizingMask@H_502_18@ = UIViewAutoresizing.FlexibleLeftMargin@H_502_18@ | UIViewAutoresizing.FlexibleRightMargin@H_502_18@
swift2改成[,]。如下
arrowImage.autoresizingMask@H_502_18@ = [UIViewAutoresizing.FlexibleLeftMargin@H_502_18@,UIViewAutoresizing.FlexibleRightMargin@H_502_18@]
个人比较喜欢swift2的这种表达方式,赞
Availability~可用性
比如layoutMargins在iOS8出现可用,
之前写代码如下,几乎很多属性都如下写:
if cell.respondsToSelector@H_502_18@("setLayoutMargins:"@H_502_18@) {
cell.layoutMargins@H_502_18@ = UIEdgeInsetsZero
}
swift2带来这种可用性使用方法#available,就不用自己写方法判断了,赞
if@H_502_18@ #available(iOS 8.0,*) {@H_502_18@
cell.layoutMargins = UIEdgeInsetsZero
} else@H_502_18@ {
// Fallback on earlier versions@H_502_18@
}
另外一种就是一个方法或一个类中含有一个高版本的实力变量
@available@H_502_18@(iOS 8.0@H_502_18@,OSX 10.10@H_502_18@,*)
func startUserActivity()@H_502_18@ ->@H_502_18@ NSUserActivity {
//@H_502_18@
}
比如我在一个类中含有UIAlertController类型的变量,那么在类外面就要加上
@available@H_502_18@(iOS 8.0@H_502_18@,*)
字符串-Strings & Characters
之前计算字符串的长度
count@H_502_18@(str@H_502_18@)
现在改成
str@H_502_18@.characters.count@H_502_18@
个人认为:String类型不再遵循SequenceType,可以使用.characters,.utf8和.utf16对应字符集的运算。
例如String长度的运算:str.characters.count
枚举
- 枚举中现在支持多泛型关联值
enum@H_502_18@ Either<T1,T2> {
case@H_502_18@ First(T1)
case@H_502_18@ Second(T2)
}
或
enum@H_502_18@ Either<T1,T2> {
case@H_502_18@ First(T1),Second(T2)
}
enum@H_502_18@ Tree<T> {
case@H_502_18@ Leaf(T)
case@H_502_18@ Node(Tree,Tree)
}
CFunctionPointer U> 类型被移除
CFunctionPointer U> 类型被移除,C函数现在使用新的@convention(c)属性声明,和其他函数类型一样,@convention(c) T->U是一个非空的除非是它是可选的。@objc_block属性由@convention(block)取代。
类型标注不能用于模式匹配,而需要作为标注声明的一部分:
以前
var@H_502_18@ (a : Int@H_502_18@,b : Float@H_502_18@)@H_502_18@ = foo@H_502_18@()@H_502_18@ @H_502_18@
现在重构为
var (a,b) : (Int,Float) @H_502_18@= foo() @H_502_18@
其它
do/while循环被改为repeat/while。即
var i = 0@H_502_18@
repeat@H_502_18@ {
i++
print@H_502_18@(i)
}while@H_502_18@(i < 10@H_502_18@)
i = 0@H_502_18@
// do@H_502_18@{
// i++
// print@H_502_18@("do-while \(i)"@H_502_18@)
// }while@H_502_18@(i < 10@H_502_18@)
打印语句
Swift的文档注释现在基于Markdown语法。
- 在Objective-C的枚举类型导入到Swift时,已经废弃的枚举元素将不会影响可用元素的使用,这个可能需要Swift中一些枚举名称的改变。
- 从C中导入的枚举类型都表示为RawRepresentable,这包括哪些没有被声明为NS_ENUM和NS_OPTIONS枚举值,作为这个变化的一部分,所有这些枚举类型中的value属性都需要重名为rawValue.
- find改为indexOf(),sort被重名为sortInPlace()以及sorted()重名为sort().
- String.toInt()改为Int(String)的可失败构造器,因为构造器语法更适合类型转换。
- 在泛型函数中声明了类型参数但是在函数中没有使用时将产生一个编译时错误
- 修复了Swift中泛型需求打印时“T==T”的错误。
- 修复了跨文件协议遵循时符号不可见或者重复的错误。
- 在Swift中增加了@objc(propertyName)属性,当该属性导入到Objective-C时可以采用这个propertyName作为getter/setter访问器的默认名