swift 初见-4运算符与字符串操作

// Playground - noun: a place where people can play

import UIKit
//import Foundation

var str = "Hello, playground"
//swift 新运算符 Nil Coalescing Operator  (nil聚合运算符)  二元运算符  它是为可选型数据来设计的,通常用在解包的过程中
// 示例:  a??b ---> a!=nil? a! : b (a不为空就解包,否则返回默认值b)  a必须是optional类型 ,b类型必须和a解包后的类型是一致的
// 实例:
var name:String?
name="andy"

// 需要注意的时 name != nil 中!=与前后都有个空格否则会报错的,假如没有空格 name!变成了解包 
// 无空格时:error: type '()' does not conform to protocol 'BooleanType'
if name != nil{
    println("hello,\(name)")
    // 这里加!号,前面讲过的
    println("hello"+String(name!))
}else
{
    println("hello,kim")
}

// 简化if代码-1:
// 开发技巧:在元素前后分别留出一个空格间隔前后代码或符号
let myName:String=name != nil ? name! : "kim"
println("hello"+myName)

// 简化if代码-2
let myNames:String=name ?? "kim"
println("hello"+String(myNames)) //这样就保证了myNames始终是个有意义的值


// 区间运算符 Range Operator 常用forin循环连用

// 闭区间 [a,b] ---->a...b  //三点
// 前闭后开 [a,b)---->a..<b //两点

for indexs in 1...10
{
    indexs
 // indexs=10   error:error: cannot assign to 'let' value 'indexs' ,默认常量
}

for indexs in 1..<10
{
    indexs
    // indexs=10   error:error: cannot assign to 'let' value 'indexs' ,默认常量
}

//Logical Operator
// !a a&&b  a||b     注意 a & b , a | b这是位运算,不是逻辑运算

// String Mutability 
// var 声明的都是可变字符串 ,let 为不可变
// 遍历字符串
for c in str
{
    println(c) //c为Character型
}

// Character 类型
var ch:Character="!"  //写个字符会报错
str.append(ch)

println(str)
 // str +=ch  //这样是不能的,类型不匹配 ,两个字符串可以
countElements(str)  //计算长度,可以智能的把中文当做一个字符(底层语言中中文为unico符处理起来麻烦)
var str1:NSString=str
str1.length
var str2="hello\u{1F496}"
countElements(str2) //长度为6
var str3:NSString="hello\u{1F496}"
str3.length   // 长度为7,在这里可以发现swift处理字符串时比OC更具优势

let SFInt:Int = 2
let SFDouble:Double = 2;
let SFBool:Bool=true;
let SFTuple:(Int,Int) = (2,3) //元组
let SFOptional:Int?=nil
let SFCharaceter:Character = "!"

println("Bool:\(SFBool) \n Tuple:\(SFTuple)") // \n 换行

//String Comparing
let stringA="abc"
let stringB="abc"
stringA==stringB
let stringC="abd"
let stringD="d"
stringA<stringC
stringA<stringD

let array=["abc","abc","abc","abc"]
for strs in array
{   // strs.hasSuffix("c")
    if(strs.hasPrefix("a"))
    {
     println("String=\(strs)")
    }
}


// 导入OC中得框架可以使用原来OC中得其他方法 
  stringA.capitalizedString
  stringA
  stringA.uppercaseString
  stringA.lowercaseString
  stringA
  
// trim 操作  //对字符串的头尾进行截取,对中间是没有作用的
var stringE=" a    b   b   c       "
stringE.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())  //该方法来自OC
stringE
stringE.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:"a")) // 不是从头开始的,无法截取
stringE.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:" a")) //注意是两个字符, a前面有个空格
// split
stringE.componentsSeparatedByString(" ")

stringE.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString:"b"))

//join
var stringF="-"
stringF.join(["1","2","3"])

// range
stringE.rangeOfString("b")  //返回的是可选型 ,返回第一个的位置
// 最新的swift语法  可能  rangeOfString返回的是元组(22,4),不再是23..<27的range ,这是网友提供的并没有经过验证!!!!!!!!!!!
// 反向收索
stringE.rangeOfString("b", options: NSStringCompareOptions.BackwardsSearch)

// 忽略大小写
stringE.rangeOfString("b", options: NSStringCompareOptions.CaseInsensitiveSearch)

// String类型有个 String.Index索引
stringE.startIndex
stringE.endIndex

// < >为swift中泛型的概念
let stringRange = Range<String.Index>(start:stringE.startIndex,end:stringE.endIndex)

let startIndex=str.startIndex  // 注意它的0并不是整型0,而是String.Index类型
// 整型10 表示向后走10步
let endIndex:String.Index=advance(stringE.startIndex, 10)
let seachIndex=Range<String.Index>(start: startIndex, end: endIndex)

// 固定范围内搜索
stringE.rangeOfString("b", options:NSStringCompareOptions.CaseInsensitiveSearch, range: seachIndex)

// subString
var toIndex=advance(startIndex, 10)
stringE.substringToIndex(toIndex)
var fromIndex=advance(startIndex,13)
stringE.substringFromIndex(fromIndex)
// 返回的是从10 - 13 不包括第13个字符
stringE.substringWithRange(Range<String.Index>(start: toIndex, end: fromIndex))

//insert
var insertIndex=advance(stringE.startIndex,5)
stringE.substringFromIndex(fromIndex)
//stringE.insert("!", atIndex: insertIndex)
// stringE.removeAtIndex(insertIndex)
// stringE.replaceRange(<#subRange: Range<String.Index>#>, with: <#C#>)
// stringE.removeRange(<#subRange: Range<String.Index>#>)