苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型
发布日期:2021-09-29 09:56:23 浏览次数:2 分类:技术文章

本文共 7021 字,大约阅读时间需要 23 分钟。

原始链接:http://blog.csdn.net/goohong/article/details/30512483

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

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

     
  可以使用
词典提供的
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
)
"
)
}

                    

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

转载地址:https://blog.csdn.net/hengshujiyi/article/details/39375077 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:苹果新的编程语言 Swift 语言进阶(五)--控制流
下一篇:苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月20日 07时37分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【大话Mysql面试】-MySQL数据类型有哪些 2019-04-26
【大话Mysql面试】-MySQL数据引擎 2019-04-26
【大话Mysql面试】-常见SQL语句书写 2019-04-26
【大话Mysql面试】-SQL语句优化 2019-04-26
【大话Mysql面试】-Mysql事务以及隔离级别 2019-04-26
【大话Mysql面试】-Mysql索引 2019-04-26
【大话Mysql面试】-Mysql锁 2019-04-26
【大话Mysql面试】-Mysql常见面试题目 2019-04-26
08 【多线程高并发】Java线程间通信的方式 2019-04-26
【数据结构与算法】什么是跳表?通俗易懂来理解跳表 2019-04-26
【数据结构与算法】什么是图?图是什么?快速带你回顾图有关的知识点 2019-04-26
【数据结构与算法】什么是串?什么是KMP算法?字符串匹配是什么? 2019-04-26
【数据结构与算法】什么是布隆过滤器?如何防止缓存穿透的问题? 2019-04-26
【Java锁体系】CopyOnWriteArrayList是什么?线程安全的arraylist是哪个? 2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26
【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 2019-04-26
【计算机操作系统】虚拟内存是什么?分页系统地址映射?页面置换算法有哪些?分段地址映射又是什么? 2019-04-26
【计算机操作系统】设备管理?磁盘结构是怎么样的?磁盘调度算法有哪些? 2019-04-26
【多线程高并发】为什么要使用多线程?创建多少个线程合适呢? 2019-04-26