標籤:swift 字串截取 ios substringwithrange string
字串截取方法是字串處理中常用的基本方法。熟悉iOS的朋友都知道在基礎類的NSString中有substringToIndex:,substringFromIndex:以及substringWithRange:這三種基本的截取方法。
問題描述:
那麼,Swift語言中的String類是否有同樣的截取功能呢?
反覆查看String類的標頭檔,並沒有找到相同或相似的函數介面。
直接在swift檔案裡也不能對一個String類的變數調用上面的方法。
然而通過引入基礎架構,即
import Foundation
就可以使用前兩個截取方法了:
/* 字串截取 */var str:String = "Hello, World!"println(str.substringToIndex(3))println(str.substringFromIndex(3))
然而,奇怪的是第三種方法卻怎麼也用不了。無論是這樣建立範圍:
var r:NSRange = NSMakeRange(1,2)
還是這樣建立範圍:
var r = NSRange(location: 1,length: 2)
調用substringWithRange() 函數總是文法有誤:
var str1:String = str.substringWithRange(r) //文法有誤!
錯誤提示是:Cannot convert the expression‘s type ‘String‘ to type ‘Range<String.Index>‘
可見是參數類型不符合,不大瞭解Range<String.Index>這個類型到底能怎麼搞出來,但是給出以下兩種解決方案。
解決方案:
解決方案(一):把String類的變數轉存為NSString類型
var nsString: NSString = strprintln(nsString.substringWithRange(r))
當然這個方案有點賴,實質上已經不是String類的截取而是NSString類的截取了。而且每個String類的都要轉一下子,如果字串一多,就略顯麻煩。
有沒有其它方法解決這個問題呢?下面給出第二個解決方案。
解決方案(二):對String類進行擴充,重載substringWithRange()
extension String { func substringWithRange(range: NSRange) -> String! { var str1 = self.substringFromIndex(range.location) var str2 = str1.substringToIndex(range.length) return str2 }}
有了這個擴充,就可以按照NSString的方式來截取字串啦!
完整示範代碼:
//// main.swift// Swift中字串的截取方法//// Created by 杜子兮 on 14-7-4.// Copyright (c) 2014年 lanou3g.com 藍鷗 All rights reserved.//var str:String = "Hello, World!"/* import Foundation之前,子串截取方法不能使用 */// println(str.substringToIndex(3)) //error// println(str.substringFromIndex(3)) //errorimport Foundation/* import Foundation之後,下面這兩個函數可以直接使用 */println(str.substringToIndex(3))println(str.substringFromIndex(3))var r:NSRange = NSMakeRange(3,5)/* String類的變數不能直接這樣取中間子串 */// println(str.substringWithRange(r)) //error// 解決方案(一):轉換為NSString類的var nsString: NSString = strprintln(nsString.substringWithRange(r))// 解決方案(二):擴充String類extension String { func substringWithRange(range: NSRange) -> String! { var str1 = self.substringFromIndex(range.location) var str2 = str1.substringToIndex(range.length) return str2 }}println(str.substringWithRange(r))