[Swift]Day02:Swift 中的字符串

简介

String 中的字符串是值类型,传递的时候会对值进行拷贝,而 NSString 的字符串传递则是引用。我们可以用 for in 遍历字符串:

var a : String = “a”

for c in “Hello” {
    println(c)
}

可以通过 countElements 计算字符串的字符数量:

countElements(“1234567”) // 7

不过要注意的是,countElements 和 NSString 的 length 并不总是完全一样的值,因为length 利用的是 UTF-16 类型的值,而不是 Unicode 字符。比如 emoji 表情加进去之后,UTF-16 算的结果是2,而 Unicode 的计算结果是1。可以看下面这个例子:

var a = “Hello?”
countElements(a) // 6 - Unicode
a.utf16Count     // 7 - UTF16

可以用 utf8 获取 utf-8 的表示,同样,可以用 utf16 获取 utf-16 的表示:

var b = “Hello?”

// 72 101 108 108 111 240 159 144 182
for c in b.utf8 {
    println(c)
}

// 72 101 108 108 111 55357 56374
for c in b.utf16 {
    println(c)
}

如果要获取 Unicode 标量可以用 unicodeScalars 来获取:

// 68 111 103 33 128054”
for scalar in b.unicodeScalars {
    print(“\(scalar.value) “)
}

子串

我们没有办法直接用 str[0...4] 来截取子串,因为 String 的 Subscript 的参数必须是String.Index 的:

subscript(i: String.Index) -> Character { get }
subscript(subRange: Range<String.Index>) -> String { get }

要获取 SubString 的话需要这样:

let digits = “0123456789”
let position = 3
let index = advance(digits.startIndex, position)
let character = digits[index] // -> “3”

或者用 substringWithRange 方法:

var str = “abcdefg”

str.substringWithRange(Range<String.Index>(start: advance(str.startIndex,2), end: str.endIndex))

其中, advance(i, n) 等价于 i++n,只需要传一个 ForwardIndexType 的值,就可以返回 i 往后的第 n 个值。比如 advance(1, 2) 返回的是 1+2 也就是3。

我们可以通过 Extension 的方式给 String 加上整数类型的下标:

var digits = “12345678901234567890”

extension String
{
    subscript(integerIndex: Int) -> Character
        {
            let index = advance(startIndex, integerIndex)
            return self[index]
    }

    subscript(integerRange: Range<Int>) -> String
        {
            let start = advance(startIndex, integerRange.startIndex)
            let end = advance(startIndex, integerRange.endIndex)
            let range = start..<end
            return self[range]
    }
}

digits[5]     // works now
digits[4…6] // works now

可以用 rangeOfString() 来判断是否包含子串:

var myString = “Swift is really easy!”

if myString.rangeOfString(“easy”) != nil {

    println(“Exists!”)

}

拼接

把数组里的值拼接成字符串是经常遇到的情况。我们可以用遍历拼接所有元素:

let animals = [“cat”, “dog”, “turtle”, “swift”, “elephant”]

var result: String = “”
for animal in animals {
    if countElements(result) > 0 {
        result += “,”
    }
    result += animal
}

result  // “cat,dog,turtle,swift,elephant”

当然也有更简单的方式,join 函数:

println(“a list of animals: ” + “,”.join(animals))

可以用 map 给每个元素都加个列表标记:

println(“\n”.join(animals.map({ “- ” + $0})))

可以用 capitalizedString 将字符串首字母大写:

let capitalizedAnimals = animals.map({ $0.capitalizedString })

println(“\n”.join(capitalizedAnimals.map({ “- ” + $0})))

可以通过 sorted() 方法对数组内的元素进行排序:

let sortedAnimals = animals.sorted({ (first, second) -> Bool in
    return first < second
})

println(“\n”.join(sortedAnimals.map({ “- ” + $0})))

你可以通过自定义运算符的方式来实现字符串 *n 的效果,就像是 3*5=15 这样:

func *(string: String, scalar: Int) -> String {
    let array = Array(count: scalar, repeatedValue: string)
    return “”.join(array)
}

println(“cat ” * 3 + “dog ” * 2)
// cat cat cat dog dog

分解

基于 Foundation ,我们可以用 componentsSeparatedByString 把字符串分解成数组:

import Foundation

var myString = “Berlin, Paris, New York, San Francisco”
var myArray = myString.componentsSeparatedByString(“,”)
//Returns an array with the following values:  [“Berlin”, ” Paris”, ” New York”, ” San Francisco”]

如果你希望基于多个字符进行分解,那需要使用另一个方法:

import Foundation

var myString = “One-Two-Three-1 2 3”
var array : [String] = myString.componentsSeparatedByCharactersInSet(NSCharacterSet (charactersInString: “- “))
//Returns [“One”, “Two”, “Three”, “1”, “2”, “3”]

如果不希望基于 Foundation 进行分解,可以使用全局函数 split()

var str = “Today is so hot”
let arr = split(str, { $0 == ” “}, maxSplit: Int.max, allowEmptySlices: false)
println(arr) // [Today, is, so, hot]

总结

在 Swift 中,String 和 NSString 会自动转换。虽然 String 已经很强大,但是用起来总归不太顺手。可以参考一下网上的 ExSwift 项目,其中的 String.swift 很好的补充了一些 String 中常用而 Apple 又没有提供的内容。


References

时间: 2024-08-25 21:50:22

[Swift]Day02:Swift 中的字符串的相关文章

读懂Swift 2.0中字符串设计思路的改变

Swift提供了一种高性能的,兼容Unicode编码的String实现作为标准库 的一部分.在Swift2中,String类型不再遵守CollectionType协议.在以前,String类型是字符的一个集合,类似于数组.现 在,String类型通过一个characters属性来提供一个字符的集合. 为 什么会有这样的变化呢?虽然模拟一个字符串作为字符的集合看起来非常自然,但是String类型与真正的集合类如Array.Set以及 Dictionnary等类型表现得完全不同.这是一直都存在的,但

swift 与 OC中的需要注意知识点

swift oc    *swift有命名空间概念,所谓命名空间即同一个命名空间中相互可以调用不用导入.不同命名空间中可以起相同的名字 swift项目就是一个命名空间 *判断是否是某个类 .协议.方法 *运行时获取类属性列表.属性名称.将C语言字符串转成oc string *基本数据类型,在OC中没有可选,swift中如果定义成可选,运行时同样获取不到,使用KVC会崩溃,所以基本数据类型需要赋初值 *private 的属性,使用运行时,同样获取不到属性,同样会让KVC崩溃 *运行时即运行时执行的

在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

原文:Using JavaScript in Swift Projects: Building a Markdown to HTML Editor 作者:GABRIEL THEODOROPOULOS 譯者:kmyhy 一直想寫一篇文章,關於如何將 Swift 和 Javascript 結合在一起,以構建強大的支持富文本的 App.這並不是我們第一次聽人說要將 Javacript 代碼嵌入到 iOS 專案中了,但當你讀完本文后,你會感到這個過程會變得前所未有的簡單,仿佛魔術一般,你只需要做很少的工

行走于 Swift 的世界中

(属于转载) 从周一 Swift 正式公布,到现在周五,这几天其实基本一直在关注和摸索 Swift 了.对于一门新语言来说,开荒阶段的探索自然是激动人心的,但是很多时候资料的缺失和细节的隐藏也让人着实苦恼.这一周,特别是最近几天的感受是,Swift 并不像我上一篇表达自己初步看法的文章里所说的那样,相对于 objc 来说有更好的学习曲线.甚至可以说 objc 在除了语法上比较特别以外,其概念还是比较容易的.而 Swift 在漂亮的语法之后其实隐藏了很多细节和实现,而如果无法理解这些细节和实现,就

swift标准库中常见的55个协议。

swift标准库中常见的55个协议. 从协议名结尾字面上我们可以将Protocol分为able.Type.Convertible 三类 从功能角度上来讲的话可以总结为: 功能添加型(able结尾) "可以做什么?" 举例: Hashable: 给你的实例添加一个生成哈希值的功能. Equatable: 给你的实例添加一个判断相等的功能. 2.类型对比型(Type结尾) "这个实例是什么?" 举例: CollectionType: swift中所有的集合类型都要遵守的

在Swift结构体中如何实现写时复制?

结构体(Struct)在Swift语言中占有重要地位,在Swift标准库中,大约有90%的公开类型都是结构体,包括我们常用的Array.String.Dictionary.结构体相比类,一个最重要的特性就是它是值类型,而类似引用类型.值类型是通过复制值来赋值的,而不是引用同一个内存地址,这样就不存在数据共享的问题,能防止意外的数据改变,并且它是线程安全的. 举一个很简单的例子,在objc中,数组是类,是引用类型,在Swift中,数组是结构体,是值类型.因此下面的代码中: let array1 =

《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式

原创文章,欢迎转载.转载请注明:关东升的博客 Swift 2.0中的print函数有4种重载形式: print(_:).输出变量或常量到控制台,并且换行. print(_:_:).输出变量或常量到指定类型的流中,并且换行. print(_:appendNewline:).输出变量或常量到控制台,appendNewline参数是布尔值,true表示换行,false表示不换行. print(_:_:appendNewline:).输出变量或常量指定类型的流中,appendNewline参数是布尔值,

iOS开发——开发总结Swift篇&amp;Swift中的条件编译

Swift中的条件编译 在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如: 1 #if TARGET_OS_IPHONE 2 3 #define MAS_VIEW UIView 4 5 #elif TARGET_OS_MAC 6 7 #define MAS_VIEW NSView 8 9 #endif 在swift中,由于对C语言支持没有Objective-C来得那么友好(暂时不知swift 2到C的支持如何),所以我们无

使用swift在sprite中显示圆角UIButton按钮

我对objective-C不是很熟,UIKit以前没有用过,SpriteKit也只看了遍教程,然后看了一遍swift语言教程,此时开始编写这个程序,所以遇到的问题比较小儿科,解决方法也是曲线救国,希望有高人指点解决这些问题的简单方法,有好的解决方法后,我会随时进行本日志的修改,以免误导他人. 程序界面很是简单 然后点击中间的游戏区域,会roll色子,随机产生1~6的数字,飞机前进若干步,遇到梯子向前跳若干步,而遇到蛇则后退若干步,指导抵达25格,游戏结束. 上面有一个标签,显示游戏状态和Roll