warning: 'characters' is deprecated: Please use String or Substring directly
Solution 1
Swift 4 introduced changes on string API.
You can just use !stringValue.isEmpty
instead of stringValue.characters.count > 0
for more information you get the sample from here
for e.g
let edit = "Summary"
edit.count // 7
Solution 2
Swift 4 vs Swift 3 examples:
let myString = "test"
for char in myString.characters {print(char) } // Swift 3
for char in myString { print(char) } // Swift 4
let length = myString.characters.count // Swift 3
let length = myString.count // Swift 4
Solution 3
One of the most common cases for manipulating strings is with JSON responses. In this example I created an extension in my watch app to drop the last (n) characters of a Bitcoin JSON object.
Swift 3:
func dropLast(_ n: Int = 0) -> String {
return String(characters.dropLast(n))
Xcode 9.1 Error Message:
'characters' is deprecated: Please use String or Substring directly
Xcode is telling us to use the string variable or method directly.
Swift 4:
func dropLast(_ n: Int = 0) -> String {
return String(dropLast(n))
}
Complete Extension:
extension String {
func dropLast(_ n: Int = 0) -> String {
return String(dropLast(n))
}
var dropLast: String {
return dropLast()
}
}
Call:
print("rate:\(response.USDRate)")
let literalMarketPrice = response.USDRate.dropLast(2)
print("literal market price: \(literalMarketPrice)")
Console:
//rate:7,101.0888 //JSON float
//literal market price: 7,101.08 // JSON string literal
Additional Examples:
-
print("Spell has \(invisibleSpellName.count) characters.")
-
return String(dropLast(n))
return String(removeLast(n))
Documentation:
You'll often be using common methods such as dropLast()
or removeLast()
or count
so here is the explicit Apple documentation for each method.
Solution 4
Use this characters
because String
stopped being a collection in Swift 2.0. However this is still valid code in Swift 4 but is no longer necessary now that String
is a Collection
again.
For example a Swift 4 String
now has a direct count property that gives the character count:
// Swift 4
let spString = "Stack"
spString.count // 5
Examples for String and SubString.
String
Swift 4 String
now directly get Element that gives the first character of String: (string.characters.first)
let spString = "Stack"
let firstElement = spString.first //S
SubString
Using SubString get first character.
let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Solution 5
Just remove characters For example:
stringValue.characters.count to stringValue.count
Related videos on Youtube
Krunal
Contact me, if you're looking for a CTO or Engineering Director/VP. contact: +91 - 9737007007 mail: [email protected] Following some great SO users....
Updated on September 04, 2020Comments
-
Krunal almost 4 years
characters - an instance property of String, is deprecated from with Xcode 9.1
It was very useful to get a substring from String by using the
characters
property but now it has been deprecated and Xcode suggests to usesubstring
. I've tried to check around SO questions and apple developer tutorials/guidelines for the same. But could not see any solution/alternate as suggested.Here is warning message:
'characters' is deprecated: Please use String or Substring
I've so many string operations are performed/handled using property
characters
.Anyone have any idea/info about this update?
-
vadian over 6 yearsHere is an interesting article about the
String
changes from Swift 3 to 4 and please read also SE0163 -
holex over 6 yearstry to use
count
instead. -
Efren about 6 yearsIf you were using
string.characters.forEach
the new API isstring.forEach { char in process(char) }
-
-
Krunal over 6 yearsThanks for your answer.. But can I have detail reference of sub string. This is just sample example, I've so many other operations dealing with characters
-
songxunzhao over 6 yearsPlease check detail information from here. developer.apple.com/library/content/documentation/Swift/…
-
songxunzhao over 6 yearslet greeting = "Hello, world!" let index = greeting.index(of: ",") ?? greeting.endIndex let beginning = greeting[..<index]
-
Dennis Vennink over 6 yearsOnline reference for Substring.
-
Leo Dabus over 6 yearsNever use count > 0 to check if a collection is empty. There is a property on Collection called isEmpty exactly for that. From the docs When you need to check whether your collection is empty, use the isEmpty property instead of checking that the count property is equal to zero. For collections that don’t conform to RandomAccessCollection, accessing the count property iterates through the elements of the collection.
-
Jonny over 6 years
extension Collection {var isNotEmpty: Bool {get {return self.isEmpty ? false : true}}}
-
Bhanu Birani over 6 yearsIs it backward compatible? I've few 3.0.2 version to support as well.
-
Leo Dabus about 6 years@Jonny
extension Collection { var isNotEmpty: Bool { return !isEmpty } }
-
Pulkit almost 6 yearsI want to get first character of string so I want to know that which way should I use let firstElement = spString.first or Substring?
-
Pranavan SP almost 6 years@Pulkit Better to use
.first
because if string is""
empty. it will only return nil butsubstring
will produce error. -
Pulkit almost 6 yearshow to convert this line of code to swift 4 'AuthorImageText = String(val.characters[(AuthorName.startIndex)]).capitalized'
-
Pranavan SP almost 6 years@Pulkit just remove
.characters
enough -
Timothy Kanski over 5 yearsThis should be the accepted answer. The question is about the replacement for string.characters.count, not the replacement for comparing to zero; that's only mentioned in the screenshot.