我正在尝试使用swift进行最基本的字符串操作。看起来string提供了我需要的一切,尽管它依赖于子字符串中间结果。所以这行得通
let myString = "0123456789"
let mySubstring = myString.dropFirst(2)
print(mySubstring.dropLast(2))
它成功地将“234567”作为子字符串产生。
然而,当我试图连锁电话…
print(myString.dropFirst(2).dropLast(2))
我得到以下错误…
9> print(myString.dropFirst(2).dropLast(2))
error: repl.swift:9:7: error: ambiguous use of 'dropFirst'
print(myString.dropFirst(2).dropLast(2))
^
Swift.Collection:39:17: note: found this candidate
public func dropFirst(_ n: Int) -> Self.SubSequence
^
Swift.Sequence:20:17: note: found this candidate
public func dropFirst(_ n: Int) -> AnySequence<Self.Element>
^
因此,编译器似乎很难推断要调用哪个dropfirst方法,这是可以理解的,因为它用不同的返回类型定义了两次。
有办法解决这个问题吗?苹果的api设计真的很差吗?我只是想得到一个很好的易于阅读和简洁的一点代码。我也可以通过使用nsstring来实现这一点,但这似乎是浪费,而且更加冗长和迟钝。
更新:
我可以得到一个更好的结果,通过添加作为子串后的链,如在…
print(myString.dropFirst(2).dropLast(2) as Substring)
…因为这消除了重载方法的歧义。我仍然希望看到一个更简洁的解决方案。谢谢。
最佳答案
如果您定义了返回类型,那么它就不难解析要使用的函数。有很多方法可以做到这一点,例如:
let mySubstring: Substring = myString.dropFirst(2).dropLast(2)
当然,正如您所说,您可以在表达式中插入此
Substring
类型:let mySubstring = (myString.dropFirst(2) as Substring).dropLast(2)