Swift基础学习

Swift3.0字符串和字符(Strings and Chara

2016-07-18  本文已影响2260人  Mustard_Buli

Swift中String代表字符串类型。Swift中的"String"类型无缝桥接了Foundation框架中的"NSString"类型。

初始化空的String(Initializing an Empty String)

var emptyString = ""
var anotherEmptyString = String()

判断String是否为空,可以通过布尔类型的"isEmpty"属性:

if  emptyString.isEmpty {
    print("Nothing to see here")
}
//Prints "Nothing to see here"

字符串是值类型(Strings Are Value Types)

Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值,其明确了无论该值来自于哪里,都是你独自拥有的。你可以放心你传递的字符串本身不会被更改。
在实际编译时,Swift编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着你始终可以将字符串作为值类型的同时获得极高的性能。

使用字符(Working with Characters)

for characters in "Dog!🐶".characters {
    print(characters)
}
// D
// o
// g
// !
// 🐶

String可以通过Character数组初始化得到


🌰

字符串的插入(String Interpolation)

🌰

Unicode

Unicode标量(Scalars)

Swift的String类型就在Unicode标量的基础上建立的.每一个字符或者修饰符(modifier)都是独一无二的21位数的Unicode标量。🌰:"U+0061"就是小写的拉丁字母A("a"),或者U+1F425就是正面的小鸡("🐥")。

U+0061 for LATIN SMALL LETTER A ("a"), or U+1F425 for FRONT-FACING BABY CHICK ("🐥").
不是所有的Unicode变量都对应一个字符,有可能是预留出来的。每个Unicode标量都有一个自己的名字,参考上面🌰。

字符串字面量中的特殊字符(Special Characters in String Literals)

字符串字面量中可以包括下面这些特殊的字符:

\0 (空字符,null character)
\\ (反斜杠,backslash)
\t (水平制表符,horizontal tab)
\n (换行符,line feed)
\r (回车,carriage return)
\" (双引号,double quote)
\' (单引号,single quote)

计算字符个数(Counting Characters)

为了得到一个字符串中字符的数量,可以使用字符串的"characters"属性的"count"属性:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// Prints "unusualMenagerie has 40 characters"

Swift在字符的值上使用的扩展字符集群,也就是说,在某些连接、修改的情况下,不会出现字符串长度的变化。
🌰:

var word = "cafe"
print("the number of characters in \(word) is \(word.characters.count)")
// Prints "the number of characters in cafe is 4"

word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301

print("the number of characters in \(word) is \(word.characters.count)")
// Prints "the number of characters in café is 4"

得到和修改字符串(Accessing and Modifying a String)

可以通过String的方法、属性或者使用下标语法。

字符串索引值(String Indices)

不同的字符需要不同大小的内存来进行存储,所以为了决定Character在一个特殊的位置,你就必须要从一个字符串的起始到终止位置重复每一个Unicode标量。因为这个原因,Swift的字符串不能用整型值来索引。

let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
插入和移除(Inserting and Removing)
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"

welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"

welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"

字符串的比较(Comparing Strings)

字符串和字符相等(String and Character Equality)
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"

如果两个字符串值(字符值)得扩展字符集群具有统一码等价性(canonically equivalent),那么就被认为是相等的。
🌰:

// "Voulez-vous un café?" using LATIN SMALL LETTER E WITH ACUTE
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"

// "Voulez-vous un café?" using LATIN SMALL LETTER E and COMBINING ACUTE ACCENT
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"

if eAcuteQuestion == combinedEAcuteQuestion {
    print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"

但是存在下面这种情况,虽然看起来是一样的,但是因为Unicode标量不同,所以不相等:

let latinCapitalLetterA: Character = "\u{41}"

//斯拉夫字母A,用于俄语当中
let cyrillicCapitalLetterA: Character = "\u{0410}"

if latinCapitalLetterA != cyrillicCapitalLetterA {
    print("These two characters are not equivalent.")
}
// Prints "These two characters are not equivalent."
前缀/后缀相等(Prefix and Suffix Equality)
🌰

类似的,用"hasSuffix(_:)"方法来判断结尾处。

上一篇 下一篇

猜你喜欢

热点阅读