一、字符串( String )和字符类型(Character)
字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素。
在Swift 语言中,字符串是编码独立的Unicode字符的组合,并提供相应方法来获取以各种Unicode呈现方式包含的字符。
1、 字符串定义和初始化
Swift 语言使用var或let关键字来定义一个常量字符串(不可修改)或变量字符串(可以修改)。 而不是像Object C语言一样定义两种不同的类型。
Swift 语言允许使用一个双引号的字符串来初始化一个字符串常量或变量,如:
let someString ="Some string literal value”
根据以上语句,Swift推断someString常量的类型为字符串类型。
使用如下形式创建一个单独的字符常量或变量:
let yenSign:Character =“¥” //创建了一个初始值为’¥’的字符常量yenSign。
可以在双引号的字符串中使用如下形式包含特殊形式的字符:
1)\0,\\,\t,\n,\r,\" ,\’;
2)单字节Unicode标量,写作 \xnn, nn是两个十六进制数值;
3)双字节Unicode标量,写作\unnnn , nnnn是四个十六进制数值;
4)四字节Unicode标量,写作\Unnnnnnnn , nnnnnnnn是八个十六进制数值;
如下所示:
let wiseWords ="\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign ="\x24" // Unicode scalar U+0024
let blackHeart ="\u2665" // Unicode scalar U+2665
let sparklingHeart ="\U0001F496" // Unicode scalar U+1F496
可以使用如下两种形式来创建一个空字符串值:
var emptyString ="" // empty string literal
var anotherEmptyString =String() //使用字符串的初始化语法来初始化一个新的字符串。
通过调用字符串的isEmpty属性来检查一个字符串是否为空:
if emptyString.isEmpty {
println("Nothing to see here")
}
字符串是一种值类型,因此在使用字符串为另外的字符串赋值或者作为函数或方法的参数时,总是新复制一个字符串来赋值给另外的字符串或者传值给函数或方法,而原先的字符串值保持不变。
2、字符串运算和函数
1)字符串加操作
字符串之间或者字符串和字符之间可以使用加运算符直接相加:
let string1 ="hello"
let string2 =" there"
let character1:Character ="!"
let stringPlusCharacter =string1 +character1
let stringPlusString =string1 +string2
字符串还可以使用字符串插入语法与其它常量、变量或表达式组合成新的字符串。
let multiplier =3
let message ="\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"
2) 字符串计数
可以使用countElements全局函数来引出一个字符串中包含的字符的数目。
let unusualMenagerie ="Koala , Snail , Penguin , Dromedary "
println("unusualMenagerie has\(countElements(unusualMenagerie)) characters”)
3) 比较运算
Swift支持三种形式的字符串比较运算:字符串相等、前缀相等、后缀相等。
在两个字符串以相同次序包含真正一样的字符时才认为其相等。
let quotation ="We're a lot alike, you and I."
let sameQuotation ="We're a lot alike, you and I."
if quotation ==sameQuotation {
println("These two strings are considered equal")
}
// prints "These two strings are considered equal"
前缀等、后缀等比较运算使用字符串提供的两个方法hasPrefix及hasSuffix来检测一个字符串是否包含一个特定的字符串前缀或后缀。
两个方法在两个字符串之间执行字符与字符的比较,如果比较相同,则返回一个true布尔值,否则为false.
4) 其它操作
由于字符串是字符的收集类型,因此可以使用for-in循环来遍历其中的每个独立的字符:
for characterin"Dog!" {
println(character)
}
字符串还提供uppercaseString及lowercaseString两个函数来获取一个字符串的大小写版本。
let normal ="Could you help me, please?"
let shouty =normal.uppercaseString
// shouty is equal to "COULD YOU HELP ME, PLEASE?"
let whispered =normal.lowercaseString
// whispered is equal to "could you help me, please?”
3 、字符串的Unicode表现形式
字符串可以以UTF-8、UTF-16 及21位格式的Unicode等三种不同格式来表现或存储。
Swift提供相应不同的方式来存取字符串的不同的Unicode表现格式。
使用字符串的utf8属性来获取字符串UTF-8 格式的表现。如:
二 、收集类型(Collection)
let dogString =“Dog!"
for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
使用字符串的utf16属性来存取字符串UTF-16格式的 表现。如:
for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
使用字符串的unicodeScalars属性来存取字符串Unicode格式的表现。如:
for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
}
print("\n")
或
for scalar in dogString.unicodeScalars {
print("\(scalar) ")
}
Swift提供了两种收集类型:数组和词典。
数组以次序存储相同类型的值,词典以键值的形式存储相同类型的值。
2.1 、数组类型
还可以使用initializer语法来创建一个空的确定类型的数组:
1) 数组的创建和初始化
可以使用如下形式创建一个存储字符串值的数组:
var shoppingList = ["Eggs",“Milk”]
var someInts = Int []()
另外如果Swift可以从上下文中推断出类型信息 ,例如从上下文的函数参数或已经初始化的特定类型的变量或常量中推断。你也能使用[]语法来创建一个空的数组。例如:
someInts . append ( 3 )
// someInts 现在包含一个整形的值3.someInts = []// someInts 现在仍是类型为Int[]的一个空数组
Swift数组类型还提供了一个参数化初始化方法,用来创建一个确定大小的,每一项包含初始值的数组。
var anotherThreeDoubles = Array ( count : 3 , repeatedValue : 2.5 )
还可以使用两个类型兼容的数组使用加操作来创建一个新数组。
var sixDoubles = threeDoubles + anotherThreeDoubles
2) 数组的操作
由于上面定义的数组shoppingList被声明为一个字符串数组变量,因此可以对它修改或添加。常量类型的数组不允许修改数组的尺寸,但允许为存在的值设置新值。
可以采用如下语句来为shoppingList数组添加一个新元素:shoppingList . append ( “Flour" )
或使用如下两种方法来为上面相同的数组添加另外的项:
shoppingList += "Baking Powder”
shoppingList += [ "Chocolate Spread" , "Cheese" , “Butter” ]
可以使用数组的insert方法在数组的一个特定索引位置插入一个新的元素:
shoppingList.insert("Maple Syrup",atIndex:0)
let mapleSyrup = shoppingList.removeAtIndex(0)
在数组前面移除数组的一个项时,后边的项自动向前移动,数组包含的项数目相应减少。
还可以使用数组的removeLast方法从数组的后面移去一个项。
letapples =shoppingList.removeLast()
println ( "The shopping list contains \( shoppingList . count ) items.” )
使用数组的isEmpty属性来检查一个数组是否包含元素:
if shoppingList . isEmpty {
println ( "The shopping list is empty." )
} else {
println ( "The shopping list is not empty." )}
数组也支持使用subscript语法来引出数组中某个索引位置的元素:
var firstItem = shoppingList [ 0 ]还可以使用subscript语法改变给定索引位置元素的值:
shoppingList [ 0 ] = "Six eggs”
或使用subscript语法来一次改变数组中一个范围内的项的值:
shoppingList[4...6] = ["Bananas","Apples"]
需要注意的是,如果你使用subscript语法来引出或设置一个索引位置的值,若使用的索引超出数组的边界,将会触发一个运行时错误。Swift还提供一个 全局函数enumerate,数组作为函数的参数,可以使用该函数从数组中返回一个多元组枚举,枚举的每一项对应数组中的一个项,每个返回的多元组项包含对应数组项的数组索引和该项的值。
2.2 词典类型
1)词典的创建和初始化
可以采用如下方式创建和初始化一个名字为airports的词典变量,其类型可以从中推断出为 Dictionary<String, String>类型。
var airports = [ "TYO" : "Tokyo" , "DUB" : “Dublin" ]
词典类型的变量意味着你可以修改或者为它添加新的项。
与数组一样,可以使用词典的初始化语法来创建一个空的词典:
var namesOfIntegers = Dictionary < Int , String >()
同样,如果能够从上下文中推断出类型信息,还可以使用[:]语法创建一个空的词典:
namesOfIntegers [ 16 ] = "sixteen"
// namesOfIntegers 现在包含一个项,其键等于16,对应的值为 "sixteen"
namesOfIntegers = [:]
// namesOfIntegers 现在是一个类型为 < Int , String >的一个空词典。
2) 词典的操作
可以使用词典的只读属性count来检查一个词典包含的项的数目:
println("The dictionary of airports contains \(airports.count) items.")
airports [ "LHR" ] = “London"也可以使用 subscript语法来从词典中引出一个特定键的值,由于请求的词典中的特定键对应的值可能不存在,因此使用subscript语法查询特定键的值时,subscript返回的是一个词典类型的选项值。如果词典中特定键对应的值存在,则该选项值包含该键对应的值,否则返回的是一个nil。 如下所示使用选项绑定方法采用 subscript语法来 返回词典中相应键的值。
if let airportName = airports [ "DUB" ] {也能使用 subscript语法通过设置要移除项的值为nil来从词典中移除一个项:
println ( "The name of the airport is \( airportName ) ." )
} else {
println ( "That airport is not in the airports dictionary." )
}
airports [ "APL" ] = "Apple International"
airports [ "APL" ] = nil
词典还提供一个updateValue(forKey:)方法来设置或更新一个特定键对应的项。与使用 subscript方法一样 updateValue(forKey:)函数返回的是一个词典类型的一个选项值,如果更新的键存在则返回对应该键的更新前的值,否则返回nil。如下使用选项绑定方法采用updateValue(forKey:)方法根据提供的键来返回词典中相应键的值。
if let oldValue = airports . updateValue ( "Dublin International" , forKey : "DUB" ) {同样词典也可提供一个removeValueForKey方法从词典中移去一个项。该方法也返回一个选项值,如果要移除的项在词典中存在则返回被移除的项,否则返回nil。
println ( "The old value for DUB was \( oldValue ) ." )
}
if let removedValue = airports . removeValueForKey ( "DUB" ) {3) 词典的其它操作:
println ( "The removed airport's name is \( removedValue ) ." )
} else {
println ( "The airports dictionary does not contain a value for DUB." )
}
for ( airportCode , airportName ) in airports {还可以通过词典提供的keys和values方法来引出词典中的键或项的一个收集。
println ( " \( airportCode ) : \( airportName ) " )
}
for airportCode in airports . keys {
println ( "Airport code: \( airportCode ) " )
}
for airportName in airports . values {
println ( "Airport name: \( airportName ) " )
}