iOS项目的Swift Building IP 4地址类

iOS项目的Swift Building IP 4地址类,swift,string,parsing,int,ip-address,Swift,String,Parsing,Int,Ip Address,我试图为IP地址创建自己的类。我想将其用于iOS项目。我想弄清楚我们要把代码放在0到255之间。分离器工作不正常。我想让它保存一个ip地址,比如192.168.0.1,如果我输入400.168.0.1,它应该返回一个错误,或者说请键入一个真实的ip地址,作为输出之一,指出有问题。我试图创建一个类,当您输入一个ip地址时,它应该保存在类本身中。我想稍后制作一个iOS应用程序,帮助人们了解如何为cisco路由器和交换机分配IP地址。基本上,我想制作一个应用程序,帮助人们使用CIDR ip地址符号,就

我试图为IP地址创建自己的类。我想将其用于iOS项目。我想弄清楚我们要把代码放在0到255之间。分离器工作不正常。我想让它保存一个ip地址,比如192.168.0.1,如果我输入400.168.0.1,它应该返回一个错误,或者说请键入一个真实的ip地址,作为输出之一,指出有问题。我试图创建一个类,当您输入一个ip地址时,它应该保存在类本身中。我想稍后制作一个iOS应用程序,帮助人们了解如何为cisco路由器和交换机分配IP地址。基本上,我想制作一个应用程序,帮助人们使用CIDR ip地址符号,就像我在网上找到的这个网页程序一样,但如果没有互联网连接,我几乎无法使用。如果我能编程一个移动应用程序,可以做什么,这个网站将是伟大的我的工作线在网络

import UIKit

class IP4 {
    var ipA: Int?
    var ipB: Int?
    var ipC: Int?
    var ipD: Int?

    func fullIP() -> Int {
        var parts: [Int] = []

        if let ipA = self.ipA {
            parts += [ipA]
        }

        if let ipB = self.ipB {
            parts += [ipB]
        }

        if let ipC = self.ipC {
            parts += [ipC]
        }

        if let ipD = self.ipD {
            parts += [ipD]
        }
        return parts.joined(separator: ".")
    }
}

let ipaddress = IP4()
ipaddress.ipA = 223
ipaddress.ipB = 9
ipaddress.ipC = 50
ipaddress.ipD = 60

这是一个例子,可以在操场上测试。(在Xcode 9.4.1上测试。)

要使用面具,请执行以下操作:

extension IPv4 {
    init(maskOfLength len: Int) {
        let highBits: [UInt8] = [
            0b10000000,
            0b11000000,
            0b11100000,
            0b11110000,
            0b11111000,
            0b11111100,
            0b11111110,
            0b11111111,
        ]
        switch len {
        case 0:
            self = IPv4(0, 0, 0, 0)
        case 1...8:
            self = IPv4(highBits[len-1], 0, 0, 0)
        case 9...16:
            self = IPv4(0b11111111, highBits[len-9], 0, 0)
        case 17...24:
            self = IPv4(0b11111111, 0b11111111, highBits[len-17], 0)
        case 25...32:
            self = IPv4(0b11111111, 0b11111111, 0b11111111, highBits[len-25])
        default:
            fatalError()
        }
    }

    func masked(by mask: IPv4) -> IPv4 {
        return IPv4(self.ipA & mask.ipA, self.ipB & mask.ipB, self.ipC & mask.ipC, self.ipD & mask.ipD)
    }
}

let mask = IPv4(maskOfLength: 24)
print(mask.binaryDescription) //->11111111.11111111.11111111.00000000
print(ip.masked(by: mask).binaryDescription) //->11011111.00001001.00110010.00000000

获取IP v4地址类的扩展

enum IPv4AddressClass {
    case a
    case b
    case c
    case d
    case e
}
extension IPv4 {
    var addressClass: IPv4AddressClass {
        if ipA & 0b1_0000000 == 0b0_0000000 {
            return .a
        } else if ipA & 0b11_000000 == 0b10_000000 {
            return .b
        } else if ipA & 0b111_00000 == 0b110_00000 {
            return .c
        } else if ipA & 0b1111_0000 == 0b1110_0000 {
            return .d
        } else {
            return .e
        }
    }
}
print(ip.addressClass) //->c

这是一个例子,可以在操场上测试。(在Xcode 9.4.1上测试。)

要使用面具,请执行以下操作:

extension IPv4 {
    init(maskOfLength len: Int) {
        let highBits: [UInt8] = [
            0b10000000,
            0b11000000,
            0b11100000,
            0b11110000,
            0b11111000,
            0b11111100,
            0b11111110,
            0b11111111,
        ]
        switch len {
        case 0:
            self = IPv4(0, 0, 0, 0)
        case 1...8:
            self = IPv4(highBits[len-1], 0, 0, 0)
        case 9...16:
            self = IPv4(0b11111111, highBits[len-9], 0, 0)
        case 17...24:
            self = IPv4(0b11111111, 0b11111111, highBits[len-17], 0)
        case 25...32:
            self = IPv4(0b11111111, 0b11111111, 0b11111111, highBits[len-25])
        default:
            fatalError()
        }
    }

    func masked(by mask: IPv4) -> IPv4 {
        return IPv4(self.ipA & mask.ipA, self.ipB & mask.ipB, self.ipC & mask.ipC, self.ipD & mask.ipD)
    }
}

let mask = IPv4(maskOfLength: 24)
print(mask.binaryDescription) //->11111111.11111111.11111111.00000000
print(ip.masked(by: mask).binaryDescription) //->11011111.00001001.00110010.00000000

获取IP v4地址类的扩展

enum IPv4AddressClass {
    case a
    case b
    case c
    case d
    case e
}
extension IPv4 {
    var addressClass: IPv4AddressClass {
        if ipA & 0b1_0000000 == 0b0_0000000 {
            return .a
        } else if ipA & 0b11_000000 == 0b10_000000 {
            return .b
        } else if ipA & 0b111_00000 == 0b110_00000 {
            return .c
        } else if ipA & 0b1111_0000 == 0b1110_0000 {
            return .d
        } else {
            return .e
        }
    }
}
print(ip.addressClass) //->c

提示:有时您必须将整数转换为字符串…为什么
ipA
-
ipD
是可选的?根据规范要求,所有4个零件都是必需的。您希望得到什么类型的结果?字符串表示法?(正如您的
所建议的那样。)网络顺序字节序列?(那么结果类型应该是有序的集合,如
数据
[UInt8]
)或主机顺序内部表示?(
UInt32
在本例中是首选。)您试图生成的内容还不够清楚。我希望它保留一个类似192.168.0.1的ip地址,如果我输入400.168.0.1,它应该返回一个错误或说请键入一个真实的ip地址。如果您说只保留,则不需要使用
fullIP()
方法。该方法的用途是什么?提示:在某些情况下,您必须将整数转换为字符串…为什么
ipA
-
ipD
是可选的?根据规范要求,所有4个零件都是必需的。您希望得到什么类型的结果?字符串表示法?(正如您的
所建议的那样。)网络顺序字节序列?(那么结果类型应该是有序的集合,如
数据
[UInt8]
)或主机顺序内部表示?(
UInt32
在本例中是首选。)您试图生成的内容还不够清楚。我希望它保留一个类似192.168.0.1的ip地址,如果我输入400.168.0.1,它应该返回一个错误或说请键入一个真实的ip地址。如果您说只保留,则不需要使用
fullIP()
方法。这个方法的目的是什么?我很惊讶你能用swift编程。我考虑使用数据类型UInt8。我主要使用字符串和int。我以前从未真正使用过这些其他类型的数据类型。当您使用网络或特定于硬件的功能(例如蓝牙设备)时,您可能需要它。我希望我的代码能帮助你制作出优秀的应用程序。请记住,展示你自己的代码会对写答案有很大帮助,但是如果你对你真正想做的事情没有足够的解释,代码可能会误导读者。你的代码看起来像是ip地址的A类、B类、C类、D类、E类或更大范围。也许最好在if条件下执行此操作,而不是在案例中。我相信有人会发现你的箱子开关很有用。在为Cisco路由器和交换机开发ip地址分配应用程序时。添加了另一个扩展以获取地址类。事实上,人们通常使用32位数据类型(
UInt32
在Swift中)来表示ipv4地址,当需要每个八位字节时,他们将其分成4个八位字节。32位数据(以及4位八位组数据)可以表示包括E类在内的整个IP v4地址。我查找了unint4,swift的框架中确实有这种数据类型。我可能会按照你的建议使用4位数据类型和UInt32数据类型来保存ip地址位。我很惊讶你能用swift编程。我考虑使用数据类型UInt8。我主要使用字符串和int。我以前从未真正使用过这些其他类型的数据类型。当您使用网络或特定于硬件的功能(例如蓝牙设备)时,您可能需要它。我希望我的代码能帮助你制作出优秀的应用程序。请记住,展示你自己的代码会对写答案有很大帮助,但是如果你对你真正想做的事情没有足够的解释,代码可能会误导读者。你的代码看起来像是ip地址的A类、B类、C类、D类、E类或更大范围。也许最好在if条件下执行此操作,而不是在案例中。我相信有人会发现你的箱子开关很有用。在为Cisco路由器和交换机开发ip地址分配应用程序时。添加了另一个扩展以获取地址类。事实上,人们通常使用32位数据类型(
UInt32
在Swift中)来表示ipv4地址,当需要每个八位字节时,他们将其分成4个八位字节。32位数据(以及4位八位组数据)可以表示包括E类在内的整个IP v4地址。我查找了unint4,swift的框架中确实有这种数据类型。我可能会按照您的建议使用4位数据类型和UInt32数据类型来保存ip地址位。