swift 结构体(Structures)与类(Classes)的区别

相同点:

  1. 可以定义属性(properties)
  2. 可以定义方法(methods)
  3. 可以定义下标(subscripts)来取其值
  4. 可以使用初始化构造器(init)来初始化实例
  5. 可以使用扩展
  6. 可以遵守协议,并且实现协议

不同点(类独有的):

  1. 可以继承自父类,即可继承
  2. 可以在运行时检查和解释类实例的类型,即运行时判断实例是哪个类
  3. 可以释放它分配的所有资源,即析构器(可以实现deinit()方法)
  4. 引用计数可以有多个引用,即实例的引用计数可以大于1

构建没有初始化方法的structure和Class:

struct Resolution {
    var width = 0
    var height = 0
}
///
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

此时Resolution和VideoMode的实例的创建方法如下:

///Resolution结构的初始化
let someResolution = Resolution()
let otherResolution = Resolution(width: 12, height: 12)
///VideoMode类的初始化
let someVideoMode = VideoMode()

构建有初始化方法的structure和Class:

struct Resolution {
    var width = 0
    var height = 0
    init(width: Int) {
    	self.width = width
  	}
}
///
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
    init(frameRate: Double) {
    	self.frameRate = frameRate
  	}
}

此时Resolution和VideoMode的实例的创建方法如下:

///Resolution结构的初始化
let otherResolution = Resolution(width: 12)
///VideoMode类的初始化
let someVideoMode = VideoMode(frameRate: 2.0)

注:

  1. Structure在非可选属性都有值,且没有重写init方法,会默认有两种初始化方法,一种无参数,一种包含全部属性。
  2. Structure有非可选属性,且该非可选属性没有初始值,没有重写init方法时,会默认添加一个初始化所有无值的非可选属性的构造方法和包含全部属性的构造方法。
  3. Class在非可选属性都有值,且没有重写init的情况下,会默认添加无参数的构造方法。
  4. Class存在非可选属性没有值时,就必须重写init方法去初始化无值的非可选属性

值类型–Structure

let hd = Resolution()
var hdDemo = hd
print("\(hd.height)--\(hdDemo.height)")
//hd:0--hdDemo:0
hdDemo.height = 100
print("hd:\(hd.height)--hdDemo:\(hdDemo.height)")
//hd:0--hdDemo:100

引用类型–Class

let video = VideoMode()
var videoDemo = video
print("\(video.name)--\(videoDemo.name)")
//nil--nil
videoDemo.name = "name1"
print("\(video.name)--\(videoDemo.name)--\(video === videoDemo)")
//Optional("name1")--Optional("name1")--true

由此可见:
值类型Structure在传递实例时都是复制了一个副本给新的变量;引用类型Class在传递实例时不会复制一个副本,而是直接引用现有的实例。
注:
1. 使用let修饰的值类型实例,初始化后其属性值不可在修改,var可以。
2. swift中,整数、浮点数、布尔值、字符串、数组、字典都是值类型

#言语逻辑若有不当处,望指正!!!!!!感谢 >_<

你可能感兴趣的:(swift,swift,Structure,Class,Structure,and,Class,结构体与类)