本文首發於個人我的博客html
struct Date {
var year: Int
var month: Int
var day: Int
}
var date = Date(year: 2019, month: 6, day: 23)
複製代碼
eg:git
struct Point{
var x: Int
var y: Int
}
var p1 = Point(x: 10, y: 20)
var p2 = Point(y: 20) //報錯 Missing argument for parameter 'x' in call
var p3 = Point(x: 10) //報錯 Missing argument for parameter 'y' in call
var p4 = Point() //報錯 Missing argument for parameter 'x' in call
複製代碼
若是給定一個初始值github
struct Point{
var x: Int = 10
var y: Int
}
var p1 = Point(x: 10, y: 20)
var p2 = Point(y: 20)
var p3 = Point(x: 10) //報錯 Missing argument for parameter 'y' in call
var p4 = Point() //報錯 Missing argument for parameter 'y' in call
複製代碼
若是x 和 y都有初始值的話,就怎麼都不會報錯了,由於 全部成員都有初始值編程
struct Point{
var x: Int = 10
var y: Int = 20
}
var p1 = Point(x: 10, y: 20)
var p2 = Point(y: 20)
var p3 = Point(x: 10)
var p4 = Point()
複製代碼
初始值爲nil的話,也能夠編譯經過,好比下面這種bash
struct Point{
var x: Int?
var y: Int?
}
var p1 = Point(x: 10, y: 20)
var p2 = Point(y: 20)
var p3 = Point(x: 10)
var p4 = Point()
複製代碼
struct Point{
var x: Int = 10
var y: Int = 20
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var p1 = Point(x: 10, y: 20)
var p2 = Point(y: 20) //報錯 Missing argument for parameter 'x' in call
var p3 = Point(x: 10) //報錯 Missing argument for parameter 'y' in call
var p4 = Point() //報錯 Missing argument for parameter 'x' in call
複製代碼
struct Point {
var x: Int = 0
var y: Int = 0
}
struct Point {
var x: Int
var y: Int
init() {
x=0
y=0
}
}
複製代碼
func test(){
struct Point {
var x: Int = 0
var y: Int = 0
}
let p = Point() //這一行打斷點
print(p)
}
test()
複製代碼
和app
func test(){
struct Point {
var x: Int
var y: Int
init() {
x=0
y=0
}
}
let p = Point() //這一行打斷點
print(p)
}
test()
複製代碼
查看彙編,兩段代碼都是ide
testSwift`init() in Point #1 in test():
-> 0x100001d50 <+0>: pushq %rbp
0x100001d51 <+1>: movq %rsp, %rbp
0x100001d54 <+4>: xorps %xmm0, %xmm0
0x100001d57 <+7>: movaps %xmm0, -0x10(%rbp)
0x100001d5b <+11>: movq $0x0, -0x10(%rbp)
0x100001d63 <+19>: movq $0x0, -0x8(%rbp)
0x100001d6b <+27>: xorl %eax, %eax
0x100001d6d <+29>: movl %eax, %ecx
0x100001d6f <+31>: movq %rcx, %rax
0x100001d72 <+34>: movq %rcx, %rdx
0x100001d75 <+37>: popq %rbp
0x100001d76 <+38>: retq
複製代碼
這兩段代碼的彙編同樣的,也就是說,這兩段代碼徹底等效工具
struct Point {
var x: Int = 0
var y: Int = 0
var origin: Bool = true
}
print(MemoryLayout<Point>.size)
print(MemoryLayout<Point>.stride)
print(MemoryLayout<Point>.alignment)
複製代碼
打印結果爲ui
17spa
24
8
是由於內存對齊的緣故,17是由於 實際使用的是 8+8+1 = 17 24 是由於,要內存對齊,8*3 = 24
參考資料:
更多資料,歡迎關注我的公衆號,不定時分享各類技術文章。