Swift Linux Sockets Error: невозможно вызвать инициализатор для типа UnsafePointer & lt; sockaddr & gt; [Дубликат]

Как сказал @KyssTao, help(dates.num2date) говорит, что x должен быть float, дающим число дней с 0001-01-01 плюс один. Следовательно, 19910102 не 2 / янв / 1991, потому что, если вы посчитали 19910101 дней с 0001-01-01, вы получите что-то в год 54513 или подобное (разделите на 365,25, количество дней в году).

Вместо этого используйте datestr2num (см. help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
3
задан Rob N 27 August 2016 в 20:08
поделиться

2 ответа

Вы можете написать что-то вроде этого:

withUnsafePointer(to: &sockAddress) {sockaddrInPtr in
    sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1) {sockaddrPtr in
        bind(sock, sockaddrPtr, UInt32(MemoryLayout<sockaddr_in>.stride))
    }
}

Или кто-то подсказывает, что это может быть лучше:

withUnsafePointer(to: &sockAddress) {sockaddrInPtr in
    let sockaddrPtr = UnsafeRawPointer(sockaddrInPtr).assumingMemoryBound(to: sockaddr.self)
    bind(sock, sockaddrPtr, UInt32(MemoryLayout<sockaddr_in>.stride))
}

В этой статье могут быть некоторые help.


(ОБНОВЛЕНИЕ) Как описано в , ссылка, показанная Мартином R , теперь MemoryLayout<T>.stride и MemoryLayout<T>.size возвращает то же значение, которое согласуется с C sizeof, где T - импортированная C-структура. Я сохраню здесь свою stride версию ответа, но в данном случае это не что-то «требуется».

7
ответ дан Community 17 August 2018 в 08:53
поделиться

В Swift 3 вам нужно «перестроить» указатель (сравните SE-0107 UnsafeRawPointer API ):

let sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
var sockAddress = sockaddr_in()

let result = withUnsafePointer(to: &sockAddress) {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
        bind(sock, $0, socklen_t(MemoryLayout<sockaddr_in>.stride))
    }
}

Замечания:

  • Аннотации типа в let sock: Int32 и var sockAddress: sockaddr_in не нужны.
  • memset() не требуется, поскольку sockaddr_in() инициализирует все члены структуры до нуля.
  • Скрытый эквивалент C sizeof равен stride (который включает в себя возможное заполнение структуры), а не size (который не включает в себя прокладку структуры). (Эта «проблема» больше не существует. Для структур, импортированных из C, stride и size имеют одинаковое значение.)
4
ответ дан Martin R 17 August 2018 в 08:53
поделиться
  • 1
    Если вы попытаетесь использовать sizeof, Xcode рекомендует заменить его на size. – Rob N 27 August 2016 в 20:07
  • 2
    @RobN: Затем создайте отчет об ошибке для Xcode :) В C sizeof представляет собой размер структуры включая возможное дополнение в конце. В Swift шажок включает в себя прокладку структуры, а размер - нет. – Martin R 27 August 2016 в 20:08
  • 3
    Ха. :) Ну, я позволю кому-то еще сделать это, так как я не знаю, что это неправильно. Я исправил вопрос в соответствии с вашими другими замечаниями, чтобы удалить шумовой код. Благодаря! – Rob N 27 August 2016 в 20:09
  • 4
    @RobN: Не имеет значения, если в конце структуры нет прокладки. С шагами вы находитесь в безопасности. Здесь stackoverflow.com/a/33177600/1187415 - (возможно, экзотический) случай, когда использование размера не работает. – Martin R 27 August 2016 в 20:12
Другие вопросы по тегам:

Похожие вопросы: