我正在尝试编写一个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.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)
当您想要使用textFields中的文本时,您需要将文本转换为NWEndpoint.Host
和NWEndpoint.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"类型。主机">";错误
看起来很混乱,因为它在第一个例子中看起来是一样的,但有一个中间变量。