Проблемы с использованием переменных для представления хоста и порта при инициализации NWConnection в Swift

Я пытаюсь написать приложение для 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» и заменю myPort на 50536, тогда Xcode будет доволен, и все будет работать. Однако, как только я добавляю переменную в поля хоста и порта, я получаю эту жалобу от Xcode.

«Тип выражения неоднозначен без дополнительного контекста», и сборка завершается ошибкой.

Почему это происходит и как я могу сделать NWConnection без жесткого кодирования хоста или порта? что хорошего в том, что вы не можете получить порт и хост от пользователя и использовать эти значения для установления соединения.

Любая помощь будет принята с благодарностью.

2 ответа

XCode 14.0.1/Свифт 5.7

Я думаю, что было бы полезно немного дополнить ответ OOPer.

      var hostAddress: NWEndpoint.Host = "192.168.7.239"

Здесь прямое воздействие на значение допустимо.

Я думаю, что это ожидаемо, поскольку особенности документации Apple

      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.Host» .

Кажется запутанным, поскольку в первом примере это выглядит так же, но с промежуточной переменной.

При звонке NWConnection.init(host:port:using:), параметр hostдолжен быть типа , portдолжно быть .

Пожалуйста, попробуйте это:

              var myHost: NWEndpoint.Host = "192.168.7.239"
        var myPort: NWEndpoint.Port = 50536
        
        myConnection = NWConnection(host: myHost, port: myPort, using: .udp)

Если вы хотите использовать тексты в текстовых полях, вам нужно преобразовать тексты в NWEndpoint.Hostи NWEndpoint.Port.

Другие вопросы по тегам