Как сказал @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'
Вы можете написать что-то вроде этого:
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
версию ответа, но в данном случае это не что-то «требуется».
В 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()
инициализирует все члены структуры до нуля. sizeof
равен stride
(который включает в себя возможное заполнение структуры), а не size
(который не включает в себя прокладку структуры). (Эта «проблема» больше не существует. Для структур, импортированных из C, stride
и size
имеют одинаковое значение.) sizeof
, Xcode рекомендует заменить его на size
.
– Rob N
27 August 2016 в 20:07
UnsafeRawPointer
работает в некоторых случаях. Но я не уверен, что в этом случае лучше. Любая дополнительная информация приветствуется. – OOPer 27 August 2016 в 19:06