Проблемы с использованием переменных для представления хоста и порта при инициализации 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
.