IPv4 地址
由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用 (".") 分割
不会以 0 开头

172.16.254.1

172.16.254.01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func isValidIPv4(_ ip: String) -> Bool {

let parts = ip.components(separatedBy: ".")
// 判断字符串切割完是否为 4 部分
if parts.count != 4 {
return false
}

for value in parts {

// 判断数字字符串是否以 0 开头
if value.first == "0", value.count > 1 {
return false
}

// 字符串转换十进制数,转换失败取 -1
let intValue = Int(value) ?? -1

// 判断是否在有效范围内
guard 0...255 ~= intValue else {
return false
}

}

return true
}

IPv6 地址
由 8 组 16 进制的数字来表示,每组表示 16 比特。用 (":") 分割
可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写
不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况
多余的 0 是不被允许的

2001:0db8:85a3:0000:0000:8a2e:0370:7334

2001:db8:85a3:0:0:8A2E:0370:7334

2001:0db8:85a3::8A2E:0370:7334

02001:0db8:85a3:0000:0000:8a2e:0370:7334

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
func isValidIPv6(_ ip: String) -> Bool {

let parts = ip.components(separatedBy: ":")

// 判断字符串切割完是否为 8 部分
if parts.count != 8 {
return false
}

for value in parts {

// 判断长度是否超过 4
if value.count > 4 {
return false
}

// 字符串转换为十六进制数,转换失败取 -1
let intValue = Int(value, radix: 16) ?? -1

// 判断是否在有效范围内
guard 0...0xffff ~= intValue else {
return false
}

}

return true
}