1

为什么下面的alternative1可以完美地工作?

宏当然是伪造的,仅用于说明目的:

func commonPrefixLength<T: Swift.Collection, U: Swift.Collection where
    T: Sequence, U: Sequence,
    T.GeneratorType.Element: Equatable,
    T.GeneratorType.Element == U.GeneratorType.Element>
    (collection1: T, collection2: U) -> T.IndexType.DistanceType {
        var collection2generator = collection2.generate()

        var i: T.IndexType.DistanceType = 0

        for element1 in collection1 {
#if alternative1
            let element2 = collection2generator.next()

            if (element1 != element2) {
                return i
            }
#elseif alternative2
            let optionalElement2 = collection2generator.next()

            if let element2 = optionalElement2 {
                if (element1 != element2) {
                    return i
                }
            }
            else {
                break
            }
#endif

            i++
        }

        return i
}
commonPrefixLength("abX", "abc")

这里是上面的要点。

4

1 回答 1

1

在比较中,您将一个可选的 ( element2) 与一个非可选的 ( element1) 进行比较。

if (element1 != element2) {
    return i
}

将可选与非可选进行比较是没有问题的。为什么应该有?如果element2nil,那么上面比较的结果就是true。这很好定义。

非可选项可以隐式转换为可选项,否则您将无法将非可选项分配给可选项。

let nonOptional = ""
var optional: String? = nonOptional
于 2014-06-08T18:58:10.693 回答