在SWIFT中初始化NWConnection时,使用变量表示主机和端口时遇到问题

jfewjypa  于 2022-10-04  发布在  Swift
关注(0)|答案(2)|浏览(557)

我正在尝试编写一个MacOS应用程序,通过UDP套接字连接到网络上的无线电扫描仪。该应用程序将命令发送到扫描仪进行远程控制。当我硬编码NWConnection启动时,我可以让应用程序工作得很好,但当我放入一个表示端口或主机的变量时,我得到了一个Xcode错误。

我希望用户能够输入其特定的主机和端口地址,因此我为用户设置了文本字段来输入这些值。然后,我希望在初始化连接时检索这些值并将它们输入到主机和端口NWConnection字段中。

以下是一段代码片段:

func makeConnection(){
        var myHost = "192.168.7.239"
        var myPort = 50536 as UInt16

        myConnection = NWConnection(host: myHost, port: myPort, using: .udp)
        myConnection?.stateUpdateHandler = { (newState) in
            switch (newState) {
            case .ready:
                print("ready")
                self.send()
                self.receive()
            case .setup:
                print("setup")
            case .cancelled:
                print("cancelled")
            case .preparing:
                print("preparing")
            default:
                print("waiting or failed")

            }
        }

在本例中,如果我将myhost替换为“192.168.7.239”,并将myport替换为50536,那么Xcode会很高兴,并且一切正常。然而,只要我在host和port字段中放入一个变量,我就会收到Xcode的抱怨。

“在没有更多上下文的情况下,表达式的类型不明确”,构建失败。

为什么会发生这种情况?我如何在不对主机或端口进行硬编码的情况下建立NWConnection?好处是您不能从用户那里获得端口和主机并使用这些值来建立连接。

任何帮助都将不胜感激。

zaqlnxep

zaqlnxep1#

调用NWConnection.init(host:port:using:)时,参数host需要是NWEndpoint.Host类型,port需要是NWEndpoint.Port类型。

请尝试这个:

var myHost: NWEndpoint.Host = "192.168.7.239"
        var myPort: NWEndpoint.Port = 50536

        myConnection = NWConnection(host: myHost, port: myPort, using: .udp)

当您想要使用文本字段中的文本时,您需要将文本转换为NWEndpoint.HostNWEndpoint.Port

qcuzuvrc

qcuzuvrc2#

XCode 14.0.1/SWIFT 5.7

我认为这可能会对Oper的回答稍加补充。

var hostAddress: NWEndpoint.Host = "192.168.7.239"

在这里,直接影响e1d0d1值是可以的。

我想这是意料之中的事,因为Apple's documentation的具体规定

typealias NWEndpoint.Host.StringLiteralType = String

但是,如果您使用中间变量来存储主机IP地址(例如,如果您通过TextField中的用户输入获取该地址),请小心:

var hostAddress = "192.168.7.239"
var myHost = NWEndpoint.Host(hostAddress)

也没问题。预期,因为初始值设定项需要String

但是:

var hostAddress = "192.168.7.239"
var myHost: NWEndpoint.Host = hostAddress

返回“无法将‘字符串’类型的值转换为指定类型‘NWEndpoint.主机’”的错误。

这似乎令人困惑,因为它在第一个示例中看起来是相同的,但带有一个中间变量。

相关问题