如何验证 Swift 中的 IPv4 和 IPv6 地址?

How can I validate IPv4 and IPv6 addresses in Swift?

IPv4 地址相对容易验证:它们有 4 个八位字节,由数字分隔。每个八位字节是一个整数,范围从 0-255。

IPv6 地址难以验证。它们有 8 个十六进制数,每个有 4 个十六进制数字,用冒号分隔。 IPv6 地址也有缩短规则,可以删除每个十六进制中的前导零(每个十六进制中至少保留一个零)。此外,一个或多个连续的 :0: 十六进制可以缩短为 ::,但在每个 IPv6 地址中只能缩短一次。

如何验证 Swift 中的 IPv4 和 IPv6 地址?

网络框架有一个可失败的初始化器,用于结构 IPv4Address 和 IPv6Address,它们采用 String 构造函数。只需测试是否可以使用字符串初始化 Struct 就足以验证地址。

这对于具有非平凡缩短规则的长格式的 IPv6 地址特别有用。

import Network

let addresses = ["1.2.33.44","1.265.33.33","2001:db8::35:44","2001:db8::33::44"]

for address in addresses {
    if let _ = IPv4Address(address) {
        print("address \(address) is a valid IPv4 address")
    } else if let _ = IPv6Address(address) {
        print("address \(address) is a valid IPv6 address")
    } else {
        print("address \(address) is neither an IPv4 address nor an IPv6 address")
    }
}

输出:

address 1.2.33.44 is a valid IPv4 address
address 1.265.33.33 is neither an IPv4 address nor an IPv6 address
address 2001:db8::35:44 is a valid IPv6 address
address 2001:db8::33::44 is neither an IPv4 address nor an IPv6 address