Я получаю ошибку компилятора в этой строке:
UIDevice.currentDevice().identifierForVendor.UUIDString.substringToIndex(8)
Тип "String.Index" не соответствует протоколу "IntegerLiteralConvertible"
Мое намерение - получить подстроку, но как?
Я получаю ошибку компилятора в этой строке:
UIDevice.currentDevice().identifierForVendor.UUIDString.substringToIndex(8)
Тип "String.Index" не соответствует протоколу "IntegerLiteralConvertible"
Мое намерение - получить подстроку, но как?
В Swift индексирование String
учитывает кластеры графем, а IndexType
не является Int
. У вас есть два варианта - привести строку (ваш UUID) к строке NSString и использовать ее как "до", или создать индекс для n-го символа.
Оба проиллюстрированы ниже:
Однако метод радикально изменился между версиями Swift. Прочитайте для более поздних версий...
Свифт 1
let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substringToIndex(5) // "Stack"
//let ss2: String = s.substringToIndex(5)// 5 is not a String.Index
let index: String.Index = advance(s.startIndex, 5)
let ss2:String = s.substringToIndex(index) // "Stack"
CMD-Click на substringToIndex
сбивает с толку вас к определению NSString
, однако CMD-Click по String
и вы найдете следующее:
extension String : Collection {
struct Index : BidirectionalIndex, Reflectable {
func successor() -> String.Index
func predecessor() -> String.Index
func getMirror() -> Mirror
}
var startIndex: String.Index { get }
var endIndex: String.Index { get }
subscript (i: String.Index) -> Character { get }
func generate() -> IndexingGenerator<String>
}
Swift 2
Как отмечает комментатор @DanielGalasko, advance
сейчас изменился...
let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substringToIndex(5) // "Stack"
//let ss2: String = s.substringToIndex(5)// 5 is not a String.Index
let index: String.Index = s.startIndex.advancedBy(5) // Swift 2
let ss2:String = s.substringToIndex(index) // "Stack"
Свифт 3
В Swift 3 это снова изменилось:
let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substring(to: 5) // "Stack"
let index: String.Index = s.index(s.startIndex, offsetBy: 5)
var ss2: String = s.substring(to: index) // "Stack"
Swift 4
В Swift 4 еще одно изменение:
let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substring(to: 5) // "Stack"
let index: String.Index = s.index(s.startIndex, offsetBy: 5)
var ss3: Substring = s[..<index] // "Stack"
var ss4: String = String(s[..<index]) // "Stack"