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
}

オプションと非オプションを比較しても問題ありません。なぜあるべきですか?の場合、上記の比較の結果は になりelement2ます。それは明確に定義されています。niltrue

非オプションは暗黙的にオプションにキャストできます。そうしないと、非オプションをオプションに割り当てることができません。

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