swif4基础学习(5)- 结构体、属性

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 类

猜你喜欢

转载自blog.csdn.net/a1034386099/article/details/88847503