Swift值类型和引用类型

2020-12-14  本文已影响0人  浪的出名

值类型

func test() {
    var age = 18

    var age2 = age
    
    age = 20
    
    age2 = 30

    print("age:\(age)--age2:\(age2)")
}

test()

结构体

struct XQTeacher {
    var age : Int
    var name : String
}
var t = XQTeacher(age: 18, name: "xq")
struct XQTeacher {
  @_hasStorage var age: Int { get set }
  @_hasStorage var name: String { get set }
  init(age: Int, name: String)
}
// XQTeacher.init()
sil hidden @$s4main9XQTeacherVACycfC : $@convention(method) (@thin XQTeacher.Type) -> @owned XQTeacher {
// %0 "$metatype"
bb0(%0 : $@thin XQTeacher.Type):
  %1 = alloc_stack $XQTeacher, let, name "self"   // users: %12, %4, %16, %17
  %2 = integer_literal $Builtin.Int64, 18         // user: %3
  %3 = struct $Int (%2 : $Builtin.Int64)          // users: %5, %14
  %4 = struct_element_addr %1 : $*XQTeacher, #XQTeacher.age // user: %5
  store %3 to %4 : $*Int                          // id: %5
  %6 = string_literal utf8 "xq"                   // user: %11
  %7 = integer_literal $Builtin.Word, 2           // user: %11
  %8 = integer_literal $Builtin.Int1, -1          // user: %11
  %9 = metatype $@thin String.Type                // user: %11
  // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:)
  %10 = function_ref @$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // user: %11
  %11 = apply %10(%6, %7, %8, %9) : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String // users: %14, %13
  %12 = struct_element_addr %1 : $*XQTeacher, #XQTeacher.name // user: %13
  store %11 to %12 : $*String                     // id: %13
  %14 = struct $XQTeacher (%3 : $Int, %11 : $String) // users: %18, %15
  retain_value %14 : $XQTeacher                   // id: %15
  destroy_addr %1 : $*XQTeacher                   // id: %16
  dealloc_stack %1 : $*XQTeacher                  // id: %17
  return %14 : $XQTeacher                         // id: %18
} // end sil function '$s4main9XQTeacherVACycfC'

引用类型

class XQTeacher {
    var age : Int = 18
    var name : String = "xq"
}
var t = XQTeacher()

结构体包含类对象属性

关键字mutaing

struct XQStack {
    var items : [Int] = []
    mutating func push(_ item : Int) {
        items.append(item)
    }
}

var s = XQStack()
s.push(1)
print(s.items)
// XQStack.push(_:)
sil hidden @$s4main7XQStackV4pushyySiF : $@convention(method) (Int, @inout XQStack) -> () {
// %0 "item"                                      // users: %5, %2
// %1 "self"                                      // users: %6, %3
bb0(%0 : $Int, %1 : $*XQStack):
  debug_value %0 : $Int, let, name "item", argno 1 // id: %2
  debug_value_addr %1 : $*XQStack, var, name "self", argno 2 // id: %3
  %4 = alloc_stack $Int                           // users: %5, %11, %9
  store %0 to %4 : $*Int                          // id: %5
  %6 = begin_access [modify] [static] %1 : $*XQStack // users: %10, %7
  %7 = struct_element_addr %6 : $*XQStack, #XQStack.items // user: %9
  // function_ref Array.append(_:)
  %8 = function_ref @$sSa6appendyyxnF : $@convention(method) <τ_0_0> (@in τ_0_0, @inout Array<τ_0_0>) -> () // user: %9
  %9 = apply %8<Int>(%4, %7) : $@convention(method) <τ_0_0> (@in τ_0_0, @inout Array<τ_0_0>) -> ()
  end_access %6 : $*XQStack                       // id: %10
  dealloc_stack %4 : $*Int                        // id: %11
  %12 = tuple ()                                  // user: %13
  return %12 : $()                                // id: %13
} // end sil function '$s4main7XQStackV4pushyySiF'

inout

上一篇下一篇

猜你喜欢

热点阅读