在 Swift 中初始化 NWConnection 时无法使用变量来表示主机和端口

Posted

技术标签:

【中文标题】在 Swift 中初始化 NWConnection 时无法使用变量来表示主机和端口【英文标题】:Having trouble using variables to represent Host and Port when initializing NWConnection in Swift 【发布时间】:2020-12-23 22:34:52 【问题描述】:

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

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

这是一个代码sn-p:

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 很高兴,一切正常。但是,只要我在主机和端口字段中添加一个变量,我就会从 Xcode 收到此投诉。

“没有更多上下文的表达式类型不明确”并且构建失败。

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

任何帮助将不胜感激。

【问题讨论】:

我认为您可能需要显示无法编译的代码,以便任何人能够帮助您。您如何从文本字段中获取主机和端口? 【参考方案1】:

调用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.HostNWEndpoint.Port

【讨论】:

谢谢。一旦我意识到错误告诉我什么,我就明白了这一点。

以上是关于在 Swift 中初始化 NWConnection 时无法使用变量来表示主机和端口的主要内容,如果未能解决你的问题,请参考以下文章

将 NWConnection 用于长时间运行的 TCP 套接字的正确方法

如何在 Swift 中初始化 ALAssetsGroupType 常量?

如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController

在 Swift 中初始化 C 结构体

在 Swift 中初始化空的字典数组

为啥结构在 Swift 中没有像类一样的反初始化器?