指针相关,关键字
UnsafePointer类似于 const Pointee * UnsafeMutablePointer 类似于 Pointee * UnsafeRawPointer 类似于 const void * UnsafeMutableRawPointer 类似于 void * UnsafeBufferPointer UnsafeMutableBufferPointer unsafeBitCast
UnsafePointer/UnsafeMutablePointer
var nickname = "alexluan"
func test1 ( _ ptr: UnsafeMutablePointer < String > ) {
print ( ptr. pointee)
print ( ptr)
}
func test2 ( _ ptr: UnsafePointer < String > ) {
print ( ptr. pointee)
print ( ptr)
}
test1 ( & nickname)
test2 ( & nickname)
print ( nickname)
打印变量指针
var nickname = "alexluan"
var ptr1 = withUnsafeMutablePointer ( to: & nickname) { $0 }
var ptr2 = withUnsafePointer ( to: & nickname) { $0 }
ptr1. pointee = "22"
print ( ptr2. pointee)
print ( nickname)
print ( ptr1)
print ( ptr2)
var ptr3 = withUnsafeMutablePointer ( to: & nickname) { UnsafeMutableRawPointer ( $0 ) }
var ptr4 = withUnsafePointer ( to: & nickname) { UnsafeRawPointer ( $0 ) }
ptr3. storeBytes ( of: "33" , as : String . self )
print ( ptr4. load ( as : String . self ) )
print ( nickname)
print ( ptr3)
print ( ptr4)
UnsafeRawPointer
var ptr0 = UnsafeRawPointer ( bitPattern: 0x000060000170c1a0 )
class Person {
var name: String = "alexluan"
}
var person = Person ( )
var ptr = withUnsafePointer ( to: & person) { UnsafeRawPointer ( $0 ) }
var heapPtr = UnsafeRawPointer ( bitPattern: ptr. load ( as : UInt . self ) )
print ( ptr0)
print ( ptr)
print ( heapPtr! )
print ( ptr. load ( as : Person . self ) . name)
var ptr = malloc ( 16 )
ptr? . storeBytes ( of: 11 , as : Int . self )
ptr? . storeBytes ( of: 22 , toByteOffset: 8 , as : Int . self )
print ( ( ptr? . load ( as : Int . self ) ) ! )
print ( ( ptr? . load ( fromByteOffset: 8 , as : Int . self ) ) ! )
free ( ptr)
var ptr = UnsafeMutableRawPointer . allocate ( byteCount: 16 , alignment: 1 )
ptr. storeBytes ( of: 11 , as : Int . self )
ptr. advanced ( by: 8 ) . storeBytes ( of: 22 , as : Int . self )
print ( ptr. load ( as : Int . self ) )
print ( ptr. advanced ( by: 8 ) . load ( as : Int . self ) )
ptr. deallocate ( )
var ptr = UnsafeMutablePointer < String > . allocate ( capacity: 3 )
ptr. initialize ( to: "11" )
ptr. successor ( ) . initialize ( to: "22000008" )
ptr. successor ( ) . successor ( ) . initialize ( to: "33" )
print ( ptr. pointee)
print ( ( ptr + 1 ) . pointee)
print ( ( ptr + 2 ) . pointee)
ptr[ 0 ] = "alexluan"
print ( ptr[ 0 ] )
print ( ptr[ 1 ] )
print ( ptr[ 2 ] )
ptr. deinitialize ( count : 3 )
ptr. deallocate ( )
class Person {
var age: Int
var name: String
init ( age: Int , name: String ) {
self . age = age
self . name = name
}
deinit { print ( name, "deinit" ) }
}
var ptr = UnsafeMutablePointer < Person > . allocate ( capacity: 3 )
ptr. initialize ( to: Person ( age: 18 , name: "alex" ) )
( ptr + 1 ) . initialize ( to: Person ( age: 19 , name: "eric" ) )
( ptr + 2 ) . initialize ( to: Person ( age: 20 , name: "phoenix" ) )
ptr. deinitialize ( count : 3 )
ptr. deallocate ( )
指针之间的转换
var ptr = UnsafeMutableRawPointer . allocate ( byteCount: 16 , alignment: 1 )
ptr. assumingMemoryBound ( to: Int . self ) . pointee = 11
( ptr + 8 ) . assumingMemoryBound ( to: Double . self ) . pointee = 22.0
print ( unsafeBitCast ( ptr, to: UnsafePointer < Int > . self ) . pointee)
print ( unsafeBitCast ( ptr + 8 , to: UnsafePointer < Double > . self ) . pointee)
ptr. deallocate ( )
class User { }
var user = User ( )
var ptr = unsafeBitCast ( user, to: UnsafeRawPointer . self )
print ( ptr)
var ptr0 = UnsafeMutablePointer ( & user)
print ( ptr0)
var ptr1 = UnsafeMutablePointer ( & user)
print ( ptr1)