in this example:
var str1 = "hello"
var str2 = "Hello"
if str1 < str2 { print("hello is less than Hello")}
else {print("hello is more than Hello")}
on what basis it is found that str1 is greater than str2?
in this example:
var str1 = "hello"
var str2 = "Hello"
if str1 < str2 { print("hello is less than Hello")}
else {print("hello is more than Hello")}
on what basis it is found that str1 is greater than str2?
Swift strings are compared according to the Unicode Collation Algorithm, which means that (effectively),
In your example, "hello" and "Hello" have the Unicode values
hello: U+0068, U+0065, U+006C, U+006C, U+006F 
Hello: U+0048, U+0065, U+006C, U+006C, U+006F 
and therefore "Hello" < "hello".
The "normalization" or "decomposing" is relevant e.g. for characters with diacritical marks. As an example,
a = U+0061
ä = U+00E4
b = U+0062
have the decomposed form
a: U+0061
ä: U+0061, U+0308  // LATIN SMALL LETTER A + COMBINING DIAERESIS
b: U+0062
and therefore "a" < "ä" < "b".
For more details and examples, see What does it mean that string and character comparisons in Swift are not locale-sensitive?
The two strings are compared, character by character, using each character's Unicode value. Since h has a higher code (U+0068) than H (U+0048), str1 is "greater" than str2.
Based on Martin's comment below the question, it's slightly more complex than I stated. Please see What does it mean that string and character comparisons in Swift are not locale-sensitive? for more detail.
I think it is based on the Lexicographical Order.https://en.wikipedia.org/wiki/Lexicographical_order
In Swift 4.2 - //Unicode Value gives you an idea why "hello" is greater than "Hello" as the length of both Strings are the same.
var str1 = "hello"
var str2 = "Hello"
if (str1 < str2){
    print("hello is less than Hello")
}
else {
    print("hello is more than Hello")
}
print(str1.unicodeScalars[str1.unicodeScalars.startIndex].value)
print(str2.unicodeScalars[str2.unicodeScalars.startIndex].value)