一、字符串( 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
格式的表现。如:

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)
")

}

二 、收集类型(Collection)

      Swift提供了两种收集类型:数组和词典。

数组以次序存储相同类型的值,词典以键值的形式存储相同类型的值。

2.1 、数组类型

1) 数组的创建和初始化

可以使用如下形式创建一个存储字符串值的数组:

var shoppingList
= ["Eggs",“Milk”]

还可以使用initializer语法来创建一个空的确定类型的数组:

         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)

可以使用数组的removeAtIndex方法从数组中移去一个特定索引位置的项,并返回被移除的项。

      let mapleSyrup = shoppingList.removeAtIndex(0)

    在数组前面移除数组的一个项时,后边的项自动向前移动,数组包含的项数目相应减少。

    还可以使用数组的removeLast方法从数组的后面移去一个项。

letapples
=shoppingList.removeLast()

可以使用数组的count属性来获取一个数组中包含的项的数目:

      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语法来一次改变数组中一个范围内的项的值:

...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.")

可以使用词典提供的subscript语法来为词典添加一个新项,或者修改一个特定键对应的项。

airports["LHR"]
= “London"

也可以使用subscript语法来从词典中引出一个特定键的值,由于请求的词典中的特定键对应的值可能不存在,因此使用subscript语法查询特定键的值时,subscript返回的是一个词典类型的选项值。如果词典中特定键对应的值存在,则该选项值包含该键对应的值,否则返回的是一个nil。如下所示使用选项绑定方法采用subscript语法来返回词典中相应键的值。

if let airportName
=airports["DUB"]
{

   println("The
name of the airport is \(airportName).")

}else
{

   println("That
airport is not in the airports dictionary.")

}

也能使用subscript语法通过设置要移除项的值为nil来从词典中移除一个项:

airports["APL"]
= "Apple International"

       airports["APL"]
= nil

词典还提供一个updateValue(forKey:)方法来设置或更新一个特定键对应的项。与使用subscript方法一样updateValue(forKey:)函数返回的是一个词典类型的一个选项值,如果更新的键存在则返回对应该键的更新前的值,否则返回nil。如下使用选项绑定方法采用updateValue(forKey:)方法根据提供的键来返回词典中相应键的值。

if let oldValue
=airports.updateValue("Dublin
International",forKey:"DUB")
{

   println("The
old value for DUB was \(oldValue).")

}

同样词典也可提供一个removeValueForKey方法从词典中移去一个项。该方法也返回一个选项值,如果要移除的项在词典中存在则返回被移除的项,否则返回nil。

if let removedValue
=airports.removeValueForKey("DUB")
{

   println("The
removed airport's name is \(removedValue).")

}else
{

   println("The
airports dictionary does not contain a value for DUB.")

}

3) 词典的其它操作:

   可以使用如下方法来遍历词典中的每一个项。

for (airportCode,airportName) in airports
{

   println("\(airportCode):\(airportName)")

}

还可以通过词典提供的keys和values方法来引出词典中的键或项的一个收集。

for airportCode in airports.keys
{

   println("Airport
code: \(airportCode)")

}

for airportName in airports.values
{

   println("Airport
name: \(airportName)")

}

版权所有,请转载时清楚注明链接和出处!


苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型的更多相关文章

  1. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

  2. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  3. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  4. 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类

    Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...

  5. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明确的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确. 常量和变量的区别是常量在设置或初始化后 ...

  6. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  7. 苹果新的编程语言 Swift 语言进阶(五)--控制流

    Swift 语言支持C语言全部的控制语句.包含for  和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...

  8. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  9. 苹果新的编程语言 Swift 语言进阶(九)--方法和下标

    一.方法 方法是与特定类型相关的函数.与属性一样,方法也包括实例方法和类型方法. 类.结构.枚举都能定义实例方法,用来封装或实现给定类型的一个实例相关的功能或特定任务. 类.结构.枚举也能定义与类型本 ...

随机推荐

  1. 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。

    给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数. #include <iostream> ...

  2. Dynamics CRM2013 用户进入系统所必需的那些权限

    本篇以CRM2013为例,在CRM中新建一个安全角色后该安全角色基本是空的,如果新建的安全角色作为一个账号的唯一安全角色时,那这个安全角色除了需要配置业务场景所需的权限外,是要优先具备进入CRM系统的 ...

  3. 18 UI美化自定义形状shape

    自定义某个控件的形状 如 圆角 巨型 环形 : 在工程文件的新建 res/drawable/shape文件(以下键一个圆角) <?xml version="1.0" enco ...

  4. Dynamics CRM 检测访问CRM延迟及带宽的工具

    直接在浏览器中访问如下地址"http://CRMHOST/organization/tools/diagnostics/diag.aspx"(这里的CRMHOST和organiza ...

  5. printk的用法

    printk的用法 内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("<6> ...

  6. Hessian源码分析--HessianProxyFactory

    HessianProxyFactory是HessianProxy的工厂类,其通过HessianProxy来生成代理类. 如下面代码: HessianProxyFactory factory = new ...

  7. [GitHub]第六讲:开源项目贡献流程

    Github 是目前世界上最大的开源项目的托管交流平台.贡献开源项目的流程也是 Github 全力支持的,也一样是遵循 Github Flow,虽然跟前面团队合作流程会有一点差别.在团队内部,大家都是 ...

  8. 我的第二个独立开发的邮箱类App—“简邮”(支持QQ、雅虎、阿里云、Outlook)

    360手机市场地址: 360市场 其它市场还在审核,囧... 为什么做这个App? 主要有两个原因 1.10月份正逢校招季,--当时和面试官介绍了这个APP 2.在苹果手机上看到一款内置的邮箱app支 ...

  9. linux下JAVA开发的环境配置

    1.去http: //java.sun.com/j2se/1.4.2/download.html 下载一个Linux Platform的JDK,建议下载RPM自解压格式的(RPM in self-ex ...

  10. CUDA学习,第一个kernel函数及代码讲解

    前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个k ...