- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题:
当尝试通过例如跨越 String.CharacterView.Index
索引时2
的一大步
extension String.CharacterView.Index : Strideable { }
let str = "01234"
for _ in str.startIndex.stride(to: str.endIndex, by: 2) { } // fatal error
fatal error: cannot increment endIndex
StrideTo<String.CharacterView.Index>
时,(
let foo = str.startIndex.stride(to: str.endIndex, by: 2)
)不会产生错误,仅在尝试跨步/迭代或对其进行操作时(
.next()
?)。
Stridable
)? next()
的
StrideToGenerator
方法中(参见本文底部),特别是在以下标记行
let ret = current
current += stride // <-- here
return ret
current
的最后一次更新(在下一次调用
next()
中),
current
索引的最终推进值大于或等于
_end
的值会产生上述特定的运行时错误(对于
Index
类型
String.CharacterView.Index
)。
(0..<4).startIndex.advancedBy(4) // OK, -> 4
"foo".startIndex.advancedBy(4) // fatal error: cannot increment endIndex
next()
的 StrideToGenerator
方法中的错误,还是只是由于误用 String.CharacterView.Index
与 Stridable
的一致性而弹出的错误? +1
以外的步骤中迭代字符的主题有关,即使两个问题不同,也值得包含在此问题中。
String.CharacterView.Index
type 描述了一个字符位置,并且:
Comparable
(因此, Equatable
), advancedBy(_:)
和 distanceTo(_:)
的实现。 Strideable
,利用
Stridable
:s 方法
stride(through:by:)
和
stride(to:by:)
的默认实现。下面的例子将侧重于后者(与前者类似的问题):
...
func stride(to end: Self, by stride: Self.Stride) -> StrideTo<Self>
Returns the sequence of values (self, self + stride, self + stride + stride, ... last) where last is the last value in the progression that is less than end.
Stridable
并通过 1
大步前进:一切都很好
String.CharacterView.Index
扩展到
Stridable
并通过
1
跨步工作正常:
extension String.CharacterView.Index : Strideable { }
var str = "0123"
// stride by 1: all good
str.startIndex.stride(to: str.endIndex, by: 1).forEach {
print($0,str.characters[$0])
} /* 0 0
1 1
2 2
3 3 */
str
中的偶数个索引(索引
0..<4
),这也适用于
2
的步幅:
// stride by 2: OK for even number of characters in str.
str.startIndex.stride(to: str.endIndex, by: 2).forEach {
print($0,str.characters[$0])
} /* 0 0
2 2 */
>1
跨步的情况:运行时异常
2
的步幅,字符 View 索引上的步幅会产生运行时错误
// stride by 2: fatal error for odd number of characters in str.
str = "01234"
str.startIndex.stride(to: str.endIndex, by: 2).forEach {
print($0,str.characters[$0])
} /* 0 0
2 2
fatal error: cannot increment endIndex */
next()
structure 的
StrideToGenerator
方法,可能是当此方法在 stridable 元素上调用
+=
时
public func += <T : Strideable>(inout lhs: T, rhs: T.Stride) {
lhs = lhs.advancedBy(rhs)
}
swift/stdlib/public/core/Stride.swift
的 Swift 源代码版本,它在某种程度上与 Swift 2.2 相对应)。鉴于以下问答:
String.CharacterView.Index.advancedBy(_:limit:)
而不是上面的
...advancedBy(_:)
。然而,据我所知,
next()
中的
StrideToGenerator
方法防止索引超过限制。
next()
中的
StrideToGenerator
方法中:
// ... in StrideToGenerator
public mutating func next() -> Element? {
if stride > 0 ? current >= end : current <= end {
return nil
}
let ret = current
current += stride /* <-- will increase current to larger or equal to end
if stride is large enough (even if this last current
will never be returned in next call to next()) */
return ret
}
current
的最后一次更新永远不会返回(在下一次调用
next()
时),
current
索引的最终推进值大于或等于
end
的值会产生上面的特定运行时错误,对于
Index
类型
String.CharacterView.Index
。
(0..<4).startIndex.advancedBy(4) // OK, -> 4
"foo".startIndex.advancedBy(4) // fatal error: cannot increment endIndex
String.CharacterView.Index
根本不打算(直接)符合
Stridable
?
最佳答案
简单地声明协议(protocol)一致性
extension String.CharacterView.Index : Strideable { }
String.CharacterView.Index
符合
BidirectionalIndexType
和
ForwardIndexType/BidirectionalIndexType
有
advancedBy()
和
distanceTo()
的默认方法实现
Strideable
的要求。
Strideable
有默认的协议(protocol)方法实现
stride()
:
extension Strideable {
// ...
public func stride(to end: Self, by stride: Self.Stride) -> StrideTo<Self>
}
String.CharacterView.Index
是——据我所知——来自
successor()
的
predecessor()
和
BidirectionalIndexType
方法。
stride()
不适用于
String.CharacterView.Index
。
String.CharacterView.Index
符合
Strideable
的
问题参见
stride(to:by:)
的
String.CharacterView.Index
方法的可能实现:
extension String.CharacterView.Index {
typealias Index = String.CharacterView.Index
func stride(to end: Index, by stride: Int) -> AnySequence<Index> {
precondition(stride != 0, "stride size must not be zero")
return AnySequence { () -> AnyGenerator<Index> in
var current = self
return AnyGenerator {
if stride > 0 ? current >= end : current <= end {
return nil
}
defer {
current = current.advancedBy(stride, limit: end)
}
return current
}
}
}
}
let str = "01234"
str.startIndex.stride(to: str.endIndex, by: 2).forEach {
print($0,str.characters[$0])
}
0 0
2 2
4 4
关于swift - 使 String.CharacterView.Index 符合 Strideable : fatal error when using stride(to:by:): "cannot increment endIndex ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36205309/
如果您想使用 String.Concat() 连接 5 个或更多字符串,则它会使用 Concat(String[])。 为什么不一直使用 Concat(String[]) 而不再需要 Concat(S
今天在使用 String 时,我遇到了一种我以前不知道的行为。我无法理解内部发生的事情。 public String returnVal(){ return "5";
似乎在我所看到的任何地方,都有一些过时的版本,这些版本不再起作用。 我的问题似乎很简单。我有一个Java类,它映射到derby数据库。我正在使用注释,并且已经成功地在数据库中创建了所有其他表,但是在这
一、string::size_type() 在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据
我正在尝试将数据保存到我的 plist 文件中,其中包含字符串数组的定义。我的plist - enter image description here 我将数据写入 plist 的代码是 -- let
我有一个带有键/值对的 JavaScript 对象,其中值是字符串数组: var errors = { "Message": ["Error #1", "Error #2"], "Em
例如,为了使用相同的函数迭代 List 和 List> ,我可以编写如下内容: import java.util.*; public class Test{ public static voi
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
这是我的 jsp 文件: 我遇到了错误 The method replace(String, String, String) in the type Functions is not appl
我需要一些帮助。我有一个方法应该输出一个包含列表内容的 txt 文件(每行中的每个项目)。列表项是字符串数组。问题是,当我调用 string.Join 时,它返回文字字符串 "System.Strin
一位同事告诉我,使用以下方法: string url = "SomeURL"; string ext = "SomeExt"; string sub = "SomeSub"; string s
给定类: public class CategoryValuePair { String category; String value; } 还有一个方法: public
我正在尝试合并 Stream>>对象与所有 Streams 中的键一起映射到单个映射中. 例如, final Map someObject; final List>> list = someObjec
在这里使用 IDictionary 的值(value)是什么? 最佳答案 使用接口(interface)的值(value)始终相同:切换到另一个后端实现时,您不必更改客户端代码。 请考虑稍后分析您的代
我可以知道这两个字典声明之间的区别吗? var places = [String: String]() var places = [Dictionary()] 为什么当我尝试以这种方式附加声明时,只有
在 .NET 4.0 及更高版本中存在 string.IsNullOrWhiteSpace(string) 时,在检查字符串时使用 string.IsNullOrEmpty(string) 是否被视为
这个名字背后的原因是什么? SS64在 PowerShell 中解释此处的字符串如下: A here string is a single-quoted or double-quoted string
我打算离开 this 文章,尝试编写一个接受字符串和 &str 的函数,但我遇到了问题。我有以下功能: pub fn new(t_num: S) -> BigNum where S: Into {
我有一个结构为 [String: [String: String]] 的多维数组。我可以使用 for 循环到达 [String: String] 位,但我不知道如何访问主键(这个位 [String:
我正在尝试使用 sarama(管理员模式)创建主题。没有 ConfigEntries 工作正常。但我需要定义一些配置。 我设置了主题配置(这里发生了错误): tConfigs := map[s
我是一名优秀的程序员,十分优秀!