鉴于:
let a = 4.2
let b = -1.3
let c = 6.4
Run Code Online (Sandbox Code Playgroud)
我想知道将这些值限制在给定范围内的最简单,最快捷的方法0...5,例如:
a -> 4.2
b -> 0
c -> 5
Run Code Online (Sandbox Code Playgroud)
我知道我可以做到以下几点:
let clamped = min(max(a, 0), 5)
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
let clamped = (a < 0) ? 0 : ((a > 5) ? 5 : a)
Run Code Online (Sandbox Code Playgroud)
但是我想知道在Swift中是否有其他方法可以做到这一点 - 特别是我想知道(并且在SO上记录,因为似乎没有关于在Swift中钳位数字的问题)是否有任何内容专门为此目的而设计的Swift标准库.
可能没有,如果是的话,这也是我乐意接受的答案.:)
Swift似乎试图贬低由一系列原子字符组成的字符串的概念,这对许多用途都有意义,但是有很多编程需要通过选择ASCII数据结构来实现所有实际目的:特别是文件I/O. 缺少用于指定字符文字的内置语言功能似乎是一个巨大的漏洞,即没有C/Java/etc-esque的模拟:
String foo="a"
char bar='a'
Run Code Online (Sandbox Code Playgroud)
这很不方便,因为即使将字符串转换为字符数组,也不能执行以下操作:
let ch:unichar = arrayOfCharacters[n]
if ch >= 'a' && ch <= 'z' {...whatever...}
Run Code Online (Sandbox Code Playgroud)
一个相当hacky的解决方法是做这样的事情:
let LOWCASE_A = ("a" as NSString).characterAtIndex(0)
let LOWCASE_Z = ("z" as NSString).characterAtIndex(0)
if ch >= LOWCASE_A && ch <= LOWCASE_Z {...whatever...}
Run Code Online (Sandbox Code Playgroud)
这很有效,但显然很难看.有没有人有更好的方法?
我遇到了这个例子,其中s1 <s2和s2 <s3但是(s1 <s3)为假:
var str1 = "????"
var str2 = "??????"
var str3 = "????:"
print(str1 < str2) // True
print(str2 < str3) // True
print(str1 < str3) // False (?)
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是真的,我们不能依赖字符串比较是传递的(这打破了我对字符串数组的排序)?我正在运行Swift 3.
更新:所有这些都是假的
print(str1 < str3) // False (?)
print(str1 == str3) // False (?)
print(str1 > str3) // False (?)
Run Code Online (Sandbox Code Playgroud)
所以有些字符串不能相互比较?
更新:如何更多运算符工作的Swift字符串中的注释指出<运算符的源代码位于https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift,并且比较通过处理_swift_stdlib_unicode_compare_utf8_utf8在https://github.com/apple/swift/blob/master/stdlib/public/stubs/UnicodeNormalization.cpp
更新:这些都是真的
print(str1 >= str3) // True
print(str1 <= str3) // True
Run Code Online (Sandbox Code Playgroud)
更新:也存在问题String.localizedCompare().有两个字符串,其中s1 = s2但s2> s1:
str1 …Run Code Online (Sandbox Code Playgroud) 在其他地方,我看到它告诉 Swift的比较使用NFD标准化.
但是,我在iSwift游乐场跑步时发现了这一点
print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}");
Run Code Online (Sandbox Code Playgroud)
给人false,尽管这是直接从标准的例子 "规范等价",这斯威夫特的文件声称遵循.
那么,什么样的规范化是由雨燕进行,这是一个错误?
我正在尝试使用scala中的字符串集合对列表进行排序,其结果应与C#列表结果相同.但是对于以下数据,C#以不同的顺序返回结果,scala以不同的顺序返回结果.任何人都可以告诉我,对于任何类型的字符串,两种语言的结果都是谁?
C#代码:
List<String> list = new List<String>();
list.Add("bmw_sip");
list.Add("bmw_mnt");
list.Add("bmw1");
list.Add("bmw");
list.Sort();
foreach (String data in list)
{
Console.Write(data+" ");
}
Run Code Online (Sandbox Code Playgroud)
输出:
bmw bmw_mnt bmw_sip bmw1
Run Code Online (Sandbox Code Playgroud)
Scala代码:
var list = List("bmw_sip", "bmw_mnt", "bmw1", "bmw")
list.sorted
Run Code Online (Sandbox Code Playgroud)
输出:
List[String] = List(bmw, bmw1, bmw_mnt, bmw_sip)
Run Code Online (Sandbox Code Playgroud) 在这个例子中:
var str1 = "hello"
var str2 = "Hello"
if str1 < str2 { print("hello is less than Hello")}
else {print("hello is more than Hello")}
Run Code Online (Sandbox Code Playgroud)
在什么基础上发现str1大于str2?
let str = "tHIS is A test"
let swapped_case = "This IS a TEST"
Run Code Online (Sandbox Code Playgroud)
Swift noob在这里,如何以编程方式执行第二个语句?