import UIKit
var str = "Hello, playground"
//1.结构体
//使用时注意:结构体总是通过被复制的方式在代码中传递,值类型
//类:引用类型
struct SizeStruct{
var height:Float = 10
var width:Float = 21
}
class SizeClass{
var height:Float = 22
var width:Float = 23
}
var structOne = SizeStruct()
var structTwo = structOne
structOne.width = 12
print("structTwo:\(structTwo)")
var classOne = SizeClass()
var classTwo = classOne
classOne.width = 2
print("classTwo.width:\(classTwo.width)") // 修改了classone.width,classtwo.width也跟着变化了
//2.结构体都有一个自动生成的成员构造函数,用于初始化构造体实例中的成员属性,像Java中的构造函数
//类没有,
var structThree = SizeStruct(height: 11, width: 3)
//string是传值类型
var str1 = "xiaoming"
var str2 = str1
str2 = "小方"
print("str1:\(str1) str2:\(str2)") // str2修改后 str1没有变化
//枚举也是传值类型
//恒等于符号 === 表示两个类的常量或者变量 引用同一个类的实例(判断地址)
// 不等于 !==
// == 表示两个值得实例 相等
let classThree = SizeClass()
let classFour = SizeClass()
let classSix = classThree
if classFour === classThree {
print("classFour和classThree同一个实例")
}else if classThree === classSix{
print("classThree 和 classSix是同一个实例")
}else{
print("都不是同一个实例")
}
//值类型 用== 号
var str3 = "xiaoming"
var str4 = "xiaoming"
if str3 == str4 {
print("值相等")
}else{
print("值不相等")
}
//swift 所有的基础类型 Int,Float Bool ,String, Array Dicitonary 都是值传递
//类是引用传递
//值传递如果在传递到方法中,可以使用inout 也变成类似于引用传递
//3.属性
/*
没有property
延迟加载 lazy
*/
class FileOperaton{
var name = "data" //属性
init() {
print("FileOperaton init")
}
}
class FileManagerTest{
lazy var fileOperaton = FileOperaton() //lazy在被用到的时候会被初始化
var desc = "FileManager"
}
var file = FileManagerTest()//这里"FileOperaton init"没有打印
//lazy 延迟加载存储属性声明变量 (var)如果是常量,常量属性在构造过程中,必须有初始值
// 2.1 计算属性,存储属性
// 计算属性 类似于 get,set,并不直接存储值,而是提供一个get来获取值,set来间接设置属性值
class RectTest {
var x = 0.0, y = 0.0
var height = 300.0, width = 150.0
var middle: (Double, Double) {
get{
return (height / 2, width / 2) //不能直接返回 middle会死循环
}
set(param){ // 如果没有定义表示心智的参数名,可以使用默认名称newValue
//使用 middle会死循环
x = param.0 - (width / 2)
y = param.1 - (height / 2)
}
}
}
var result = RectTest()
print(result.middle)
result.middle = (10.0, 10.0)
print(result.x)
print(result.y)
//只读属性 get单独使用 可以没有set
// 有set必须有get
struct Cube{
var width = 0.0 ,height = 0.0 , depth = 0.0
var volume: Double{
return width * height * depth
}
init(width w:Double,height h:Double, depth d:Double) {
width = w
height = h
depth = d
}
}
let cubeOne = Cube(width: 2, height: 3, depth: 4)
print("体积:\(cubeOne.volume)")
//4.属性观察器
//willset didset: 在属性初始化过程中不会被调用
class StepCounter{
var totalSteps:Int = 0{
willSet { //在设置新的值前调用 , 默认新值 newValue
print("willset:\(totalSteps) newValue:\(newValue)")
}
didSet { //在新的值被设置之后调用, 默认旧值
self.totalSteps = 3 // 不会死循环
print("didSet:\(totalSteps) oldValue:\(oldValue)")
}
}
}
var setp = StepCounter()
setp.totalSteps = 2
//4.1 类的属性使用关键字 static
struct GoodsStruct{
static var type = "sssss"
var name = "meat"
static func structName(){
print("结构体使用static的静态方法")
}
//值类型属性不能再它的实例方法中被修改
/* Mutating 可改变使用场景:
1.结构体,枚举类型中声明修饰方法 mutating func funcName()
2.extension, protocol 修饰 方法
注:
a. swift 中struct,enum 均可以包含类方法和实例方法,swift官方是不建议在struct,enum 的普通方法里修改属性变量,但是在func 前面添加 mutating 关键字之后就可以方法内修改.
b. 对于protocol 方法也是适用的,mutating 可以修饰的代理方法,如果,struct,enum,class 实现协议之后可以在对应的 mutating 代理方法内修改本身的属性变量.(class 不影响,因为属性变量对于类的类方法,实例方法 是透明的,即随时都可以改变)*/
//mutating用于修改属性变量
mutating func changeName(str:String){
name = str
}
}
print(GoodsStruct.type)
class GoodsClass{
static var type = "goodsClass"
var name = "meat"
static func ClassName(){
print("类使用static的静态方法")
}
//使用class声明的静态方法
class func ClassName2(){
print("类使用class的静态方法")
}
func changeName(str:String){
name = str
}
}
print(GoodsClass.type,GoodsClass.ClassName(),GoodsClass.ClassName2())
//类方法 值类型 static 类
swif4基础学习(5)- 结构体、属性
猜你喜欢
转载自blog.csdn.net/a1034386099/article/details/88847503
今日推荐
周排行