相关疑难解决方法(0)

在Swift中"钳制"两个值之间的数字的标准方法

鉴于:

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

49
推荐指数
8
解决办法
1万
查看次数

是否有一种干净的方式来指定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)

这很有效,但显然很难看.有没有人有更好的方法?

character literals swift

16
推荐指数
2
解决办法
9818
查看次数

Swift中的字符串比较不是传递性的

我遇到了这个例子,其中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_utf8https://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

10
推荐指数
1
解决办法
216
查看次数

Swift字符串比较使用什么样的规范化?

在其他地方,我看到它告诉 Swift的比较使用NFD标准化.

但是,我在iSwift游乐场跑步时发现了这一点

print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}");
Run Code Online (Sandbox Code Playgroud)

给人false,尽管这是直接从标准的例子 "规范等价",这斯威夫特的文件声称遵循.

那么,什么样的规范化由雨燕进行,这是一个错误?

string unicode comparison unicode-normalization swift

7
推荐指数
1
解决办法
954
查看次数

在不改变C#顺序的情况下对scala列表进行排序等效于C#

我正在尝试使用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)

c# sorting scala

4
推荐指数
1
解决办法
170
查看次数

字符串比较如何在Swift中发生

在这个例子中:

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?

string swift

4
推荐指数
2
解决办法
2127
查看次数

交换字符串案例 - 迅捷

let str = "tHIS is A test"
let swapped_case = "This IS a TEST"
Run Code Online (Sandbox Code Playgroud)

Swift noob在这里,如何以编程方式执行第二个语句?

string cocoa swift

0
推荐指数
1
解决办法
557
查看次数