iOS - Swift String 字符串

简介: 前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCodingSwift 语言主要使用 String 和 Character 来存储字符数据。

前言

    public struct String
    public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
  • Swift 语言主要使用 String 和 Character 来存储字符数据。String 是字符串类型,Character 是字符类型,一个或多个字符组成一个字符串。

  • String :

    • Swift 语言中的 String 类型与经典 Cocoa 或 Cocoa Touch 框架中的 Foundation NSString 类型进行了无缝衔接,Swift 语言中的 String 类型实现了 NSString 的大部分属性和方法,字符串搜索、拷贝、插入、删除等操作都有相应的 API 函数可以使用。

    • String 类型可以调用 NSString 类型的属性和方法,但是 NSString 类型不可以调用 String 类型独有的方法。并且以往框架中的任何要求使用 NSString 类型作为参数的函数,都可以使用 String 类型来替换,Swift 语言会自动将 String 类型转换为 NSString 类型。

    • Swift 语言中可以用 as 将 NSString 类型字符串转换为 String 类型。
      • 如:var str:String = (NSString(string: "beijing") as String)
    • Swift 语言中 String 类型声明为变量就可以被修改。而在 OC 中,需要通过选择 NSString 和 NSMutableString 来指定字符串是否可以被修改。

    • Swift 语言中不能直接将字符串当作字符数组那样通过使用下标访问指定字符。

    • Swift 语言支持字符串插值,你可以在长字符串中插入常量、变量、字面量和表达式,而不用经过特殊的转换,这使得创建用于展示、存储和打印的自定义字符串变的轻松自如。插入的值放在 “ ( ) ” 的括号中。
      • 如:let gameName = "2048"; print("hello my program name is \(gameName)")
    • Swift 语言使用值传递作为默认字符串拷贝方式,无论何时,传递的都是值的拷贝,当我们对 String 类型的变量或者常量进行赋值操作或当作函数/方法的参数传递时,这个变量或者常量的值会被拷贝,然后使用这个拷贝出的值进行赋值或者当作参数传递。

    • Swift 语言由于没有 length 属性,统计字符个数需要使用新的方法,在 Swift 2.2 中使用 characters.count 获取字符串中字符数量。NSString 的 length 属性在被 Swift 的 String 值访问时会被转换为 utf16count。所以 lrngth 属性是基于 UTF-16 表示的十六位 code units 数量,而不是基于 Unicode 字符,所以通过 count 返回的字符串数量并不总是与相同字符的 NSString 的 length 属性值相同。
      • 如:let str = "hello world"; print( str.characters.count )
  • Character :

    • 由于全面支持 Unicode 字符,每一个字符值代表一个 Unicode 字符,在 Swift 语言中表示字符使用 Character 类型。

    • Swift 语言声明字符时需要加上类型名称,否则会被推断为 String 类型。
      • 如:var doller:Character = "$"

1、字符串的输出

    let num:Int = 123
    
    // 直接输出 自动换行
    print(num)

    // 使用字符串插值输出 自动换行 输出常量或变量
    print("\(num)")

    // 使用强制类型转换输出 自动换行 输出常量或变量
    print(String(num))

    // 使用输出控制符输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog("%d", num)

    // 使用字符串插值输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog("\(num)")

    // 使用强制类型转换输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog(String(num))

2、字符串的创建

    // String 型字符串的创建
        
        // 创建字符变量,必须指明为 Character 类型,否则会被自动推断为 String
        let str1:Character = "I"
    
        // 创建字符串变量,指明变量类型,未初始化
        let str2:String
    
        // 创建字符串变量,指明变量类型,并赋值
        let str3:String = "I Love China"
    
        // 创建字符串变量,未指明变量类型,自动推断为 String 类型
        let str4 = "Hello World"
    
        // 直接通过另一个字符串创建,与 str3 的地址不同,是值复制
        let str5:String = str3
    
    // NSString 型字符串的创建
        
        // 直接创建 NSString 类型字符串,未初始化
        let nsStr1:NSString
        let nsStr2:NSString = "123"
       
        // 由另一个 String 类型字符串创建
        let nsStr3 = NSString(string: str4)
    
        // 由另一个 NSString 类型字符串创建
        let nsStr4 = NSString(string: nsStr2)
    
        // 格式化创建 NSString 类型字符串
        let nsStr5 = NSString(format: "age is %d, score is %d", 18, 120)
    
        // 由 C 语言的字符串创建字符串
        let nsStr6:NSString? = NSString(CString: "bei jing nin hao", encoding: NSUTF8StringEncoding)
        let nsStr7:NSString? = NSString(UTF8String: "bei jing nin hao")
        
        // 从 文件 创建,try? 异常处理,若文件不存在或读取错误返回 nil
        let path = NSHomeDirectory() + "/Desktop/test.txt"
        let nsStr8:NSString? = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
    
        // 从 Url 创建,try? 异常处理,若文件不存在或读取错误返回 nil
        let url = NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt")
        let nsStr9:NSString? = try? NSString(contentsOfURL: url, encoding: NSUTF8StringEncoding)

3、字符串长度的计算

    // String 型字符串
    
        let str1:String = "zhou dong yu"
        
        // 计算字符串中字数长度,不是字符长度,代替 count(str1)
        let num1:Int = str1.characters.count
            
    // NSString 型字符串
    
        let str2:NSString = "hello world"
        
        // 计算字符串中字数长度,不是字符长度
        let num2:Int = str2.length

4、字符串位置的获取

    // String 型字符串
        
        let str:String = "bei jing ni hao"
            
        // 获取起始位置,即 0
        let startIndex = str.startIndex
    
        // 获取结束位置,指 字符串的结束字符 \0 的位置
        let endIndex = str.endIndex
    
        // 获取指定位置下标值,指从 str.startIndex 开始的第 n 个位置,代替 advance(str.startIndex, 2)
        let index = str.startIndex.advancedBy(2)
    
        // 获取下标区间值
        let range = str.startIndex.advancedBy(4)...str.startIndex.advancedBy(6)
    
        // 获取指定位置下标的 前一个值
        let predecessorIndex = str.startIndex.advancedBy(2).predecessor()
    
        // 获取指定位置下标的 后一个值
        let successorIndex = str.startIndex.advancedBy(2).successor()

5、字符串成员的引用(取字符)

    // String 型字符串
        
        let str1:String = "bei jing ni hao"
        
        // 取第5个字符
        let substr1:String = str1.substringWithRange(str1.startIndex.advancedBy(4)...str1.startIndex.advancedBy(4))
            
    // NSString 型字符串
    
        let str2:NSString = "bei jing ni hao"
        
        // 取第5个字符
        let substr2:unichar = str2.characterAtIndex(4)

6、字符串的连接

    // String 型字符串
    
        let str1:String = "bei "
        let str2:String  = "jing "
        
        // 使用 "+" 号连接两个字符串
        var str3:String = str1 + str2
        
        // 在字符串的末尾拼接字符串,代替 str3.extend("123456789")
        str3.write("123456789")
        
        // 参数和返回值都为 String 型
        let str4:String = str1.stringByAppendingString(str2)
        
        // 参数和返回值都为 String 型
        let str5:String = str1.stringByAppendingFormat(str2)
        let str6:String = str1.stringByAppendingFormat("%@", "jing huan ying ni")
        
    // NSString 型字符串
   
        let str7:NSString = "bei "
        let str8:NSString  = "jing "
       
        // 参数和返回值都为 String 型
        let str9:String = str7.stringByAppendingString((str8 as String))
        
        // 参数和返回值都为 NSString 型
        let str10:NSString = str7.stringByAppendingFormat(str8)
        let str11:NSString = str7.stringByAppendingFormat("%@", "jing huan ying ni")
        
        // NSMutableString 型字符串
        let str12:NSMutableString = "bei "
       
        // 追加
        str12.appendString("jing ")
    
        // 格式化追加
        str12.appendFormat("age is %d", 18)

7、字符串的比较

    // String 型字符串
        
        let str1:String = "bei jing"
        let str2:String = "BEI JING"
        
        // 判读两个字符串是否相等
        let bl1:Bool = str1 == str2
    
        // 判断字符串是否为空
        let bl2:Bool = str1.isEmpty
    
        // 判断字符串前缀
        let bl3:Bool = str1.hasPrefix("be")
    
        // 判断字符串后缀
        let bl4:Bool = str2.hasSuffix("ing")
    
        // 比较两个字符串
        let result1:NSComparisonResult = str1.compare(str2)
    
        // 忽略大小写比较
        let result2:NSComparisonResult = str1.caseInsensitiveCompare(str2)
        
    // NSString 型字符串
    
        let str3:NSString = "bei jing"
        let str4:NSString  = "BEI JING"
        
        // 判读两个字符串是否相等
        let bl5:Bool = str3 == str4
    
        // 判读两个字符串是否相等
        let bl6:Bool = str3.isEqual(str4)
    
        // 判读两个字符串是否相等
        let bl7:Bool = str3.isEqualToString(str4 as String)
    
        // 判断字符串前缀
        let bl8:Bool = str3.hasPrefix("be")
    
        // 判断字符串后缀
        let bl9:Bool = str3.hasSuffix("ing")
    
        // 忽略大小写比较
        let result3:NSComparisonResult = str3.compare(str4 as String)
        let result4:NSComparisonResult = str3.caseInsensitiveCompare(str4 as String)

8、字符串的大小写转换

    // String 或 NSString 型字符串 返回值都为 String 型
        
        let str1 = "bei JING"
        
        // 将字符串转换为大写
        let str2 = str1.uppercaseString
    
        // 将字符串转换为小写
        let str3 = str1.lowercaseString
    
        // 将字符串的单词首字母大写
        let str4 = str1.capitalizedString

9、字符串与数字的相互转换

    // String 型字符串
        
        // 字符 转 数字
        
            let char:Character = "A";
            
            var charVal1:Int = 0
           
            // 遍历字符转换为的字符串
            for charStr in String(char).unicodeScalars {
                
                // 将取出的字符转换为 Int 型数字
                charVal1 = Int(charStr.value)
            }
        
        // 字符串 转 数字
            
            // 数字型字符串 转 Int 型数字,代替 intStr.toInt()
            let intStr:String = "64";           let intVal1:Int? = Int(intStr)
                
            // 数字 转 字符
            let intVal2 = 65;                   let charVal2:Character = Character(UnicodeScalar(intVal2))

        // 数字 转 字符串
            
            // Int 型数字 转 字符串
            let intVal3:Int = 123;              let intStr1:String = intVal3.description
            
            // Int32 型数字 转 字符串
            let int32Val1:Int32 = 32;           let int32Str1:String = int32Val1.description
            
            // Int64 型数字 转 字符串
            let int64Val1:Int64 = 64;           let int64Str1:String = int64Val1.description
            
            // Float 型数字转 字符串
            let floatVal1:Float = 2.1;          let floatStr1:String = floatVal1.description
            
            // Double 型数字转 字符串
            let doubleVal1:Double = 162.1;      let doubleStr1:String = doubleVal1.description
            
            // Bool 型 转 字符串
            let boolVal1:Bool = true;           let boolStr1:String = boolVal1.description
        
    // NSString 型字符串
        
        // 字符串 转 数字
            
            // 字符串 转 Int 型数字
            let intVal4:Int = NSString(string: "6432").integerValue
    
            // 字符串 转 Int32 型数字
            let int32Val2:Int32 = NSString(string: "32").intValue
    
            // 字符串 转 Int64 型数字
            let int64Val2:Int64 = NSString(string: "64").longLongValue
    
            // 字符串 转 Float 型数字
            let floatVal2:Float = NSString(string: "2.1").floatValue
    
            // 字符串 转 Double 型数字
            let doubleVal2:Double = NSString(string: "162.1").doubleValue
    
            // 字符串 转 Bool 型
            let boolVal2:Bool = NSString(string: "false").boolValue

10、在字符串中查找子串的位置

    // NSString 型字符串
        
        let str1:NSString = "bei jing nin hao nin hao"
        let str2:String = "nin"
       
        // 顺序查找
            
            // 从前往后查找,找到第一个即停止查找
            let range1 = str1.rangeOfString(str2)
            
            // 或者 if(range1.length == 0), location 位置,length 长度
            range1.location == NSNotFound ? print("not found") : print(range1)
            
        // 条件查找
        /*
            CaseInsensitiveSearch = 1,               // “A”等同于“a”,不分大小写查找
            LiteralSearch = 2,                       // Unicode 的点对点比较。它只在所有字符都用相同的方式组成的情况下才会返回相等。
            BackwardsSearch = 4,                     // 在字符串的末尾开始反向搜索
            AnchoredSearch = 8,                      // 只考虑搜索的起始点(单独使用)或终止点(当与 NSBackwardsSearch 结合使用时)。
                                                     // 这个方法可以用来检查前缀或者后缀,以及大小写不敏感(case-insensitive)或者
                                                     // 音调不敏感(diacritic-insensitive)的比较。
                                                     
            NumericSearch = 64,                      // 它对字符串里的数字排序
             
            DiacriticInsensitiveSearch = 128,        // “A” 等同于 “Å” 等同于 “Ä.”
            WidthInsensitiveSearch = 256,            // 一些东亚文字(平假名和片假名)有全宽与半宽两种形式
            ForcedOrderingSearch = 512,
            RegularExpressionSearch = 1024           // 使用正则表达式搜索
        */
           
            // 从后往前查找,找到第一个即停止查找
            let range2 = str1.rangeOfString(str2, options: NSStringCompareOptions.BackwardsSearch)
           
            range2.location == NSNotFound ? print("not found") : print(range2)
           
        // 范围内查找
    
            // 在某个范围内查找
            let range3 = str1.rangeOfString(str2, 
                                    options: NSStringCompareOptions.CaseInsensitiveSearch, 
                                      range: NSMakeRange(8, 10))
           
            range3.location == NSNotFound ? print("not found") : print(range3)

11、字符串子串的提取(取子串)

    // String 型字符串
        
        let str1:String = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"
        
        // 从某个位置开始到结尾
        let str2:String = str1.substringFromIndex(str1.startIndex.advancedBy(8))
    
        // 从开始到某个位置
        let str3:String = str1.substringToIndex(str1.startIndex.advancedBy(18))
    
        // 某个范围内
        let str4:String = str1.substringWithRange(str1.startIndex.advancedBy(10)...str1.startIndex.advancedBy(15))
        
    // NSString 型字符串
    
        let str5:NSString = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"
        
        // 从某个位置开始到结尾
        let str6:String = str5.substringFromIndex(8)
    
        // 从开始到某个位置
        let str7:String = str5.substringToIndex(18)
    
        // 某个范围内
        let str8:String = str5.substringWithRange(NSMakeRange(10, 6))

12、字符串切割

    // String 型字符串
    
        let str1:String = "chen$chao$ni$hao$ma"
        let str2:String = "bei$jing#ni@hao&ma"
    
        // 字符串 按照字符 切割
        let arr1:Array = str1.componentsSeparatedByString("$")
    
        // 字符串 按照字符集 切割
        let arr2:Array = str2.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))
    
    // NSString 型字符串
        
        let str3:NSString = "chen$chao$ni$hao$ma"
        let str4:NSString = "bei$jing#ni@hao&ma"
        let str5:NSString = "Users/JHQ0228/Desktop"
        
        // 字符串 按照字符 切割
        let arr3:Array = str3.componentsSeparatedByString("$")
    
        // 字符串 按照字符集 切割
        let arr4:Array = str4.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))
    
        // 自动按照 "/" 分割字符串
        let arr5:Array = str5.pathComponents

13、字符串的插入

    // String 型字符串
    
        var str1:String = "bei jing ying ni "
        
        // 指定位置插入字符,str1.endIndex 字符串末尾位置
        str1.insert("!", atIndex: str1.endIndex)
    
        // 指定位置插入字符串,替代 str1.splice
        str1.insertContentsOf("huan ".characters, at: str1.startIndex.advancedBy(9))
    
    // NSMutableString 型字符串
        
        let str2:NSMutableString = "bei jing ying ni"
        
        // 指定位置插入字符串
        str2.insertString("huan ", atIndex: 9)
    
        // 重写全部字符串
        str2.setString("nan jing huan ying ni")

14、字符串的删除

    // String 型字符串
        
        var str1:String = "bei jing ren min huan ying nin !"
        
        // 指定位置删除字符 "!"
        str1.removeAtIndex(str1.endIndex.predecessor())
    
        // 指定范围删除字符串 "ren min "
        str1.removeRange(str1.startIndex.advancedBy(9)...str1.startIndex.advancedBy(16))
    
        // 删除全部字符串
        str1.removeAll(keepCapacity: true)
        
    // NSMutableString 型字符串
        
        let str2:NSMutableString = "bei jing ren min huan ying nin !"
        
        // 删除指定范围的字符串
        str2.deleteCharactersInRange(NSMakeRange(9, 8))

15、字符串的替换

    // String 型字符串
    
        var str1:String = "bei jing huan ying nin !"
            
        // 用字符替换指定位置的字符串
        str1.replaceRange(str1.startIndex...str1.startIndex.advancedBy(2), with: "I")
            
    // NSMutableString 型字符串
    
        var str2:NSMutableString = "bei jing huan ying nin !"
    
        // 替换指定位置的字符串
        str2.replaceCharactersInRange(NSMakeRange(9, str2.length - 9), withString: "ni hao")
    
        // 查找并替换指定的字符串
        str2.replaceOccurrencesOfString("in", 
                             withString: "IN", 
                                options: NSStringCompareOptions.LiteralSearch, 
                                  range: NSMakeRange(0, str2.length))
目录
相关文章
|
2月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
48 1
|
1天前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
13 5
|
4天前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
10天前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
26 3
|
15天前
|
索引
Sass String(字符串) 函数
Sass String(字符串) 函数用于处理字符串并获取相关信息。
26 1
|
23天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
36 4
|
1月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
1月前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
44 3
|
1月前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
2月前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
55 0