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



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

我希望用户能够输入他们特定的主机和端口地址,因此我为用户设置了文本字段来输入这些值。然后,我想检索这些值,并在初始化连接时将它们输入到Host和Port 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";我用50536替换了myPort,然后Xcode很高兴,一切都正常。然而,当我在主机和端口字段中放入变量时,我就收到了Xcode的抱怨。

"表达式的类型在没有更多上下文的情况下是模糊的";并且构建失败。

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

如有任何帮助,我们将不胜感激。

调用NWConnection.init(host:port:using:)时,参数host的类型需要为NWEndpoint.Hostport的类型必须为NWEndpoint.Port

请尝试这个:

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

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

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

XCode 14.0.1/Swift 5.7

我认为补充一下OOPer的回答可能会很有用。

var hostAddress: NWEndpoint.Host = "192.168.7.239"

这里,直接影响String值是可以的

我认为这是意料之中的事,因为苹果的文档特定于

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

返回一个">无法将"String"类型的值转换为指定的"NWEndpoint"类型。主机">";错误

看起来很混乱,因为它在第一个例子中看起来是一样的,但有一个中间变量。

最新更新