大佬教程收集整理的这篇文章主要介绍了Swift学习第四枪,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue: 0,length: 3) // 该区间表示整数0,1,2 rangeOfThreeItems.firstValue = 6 // 该区间现在表示整数6,7,8@H_675_29@FixedLengthRange 的实例包含一个名为 firstValue 的变量存储属性和一个名为 length 的常量存储属性。在上面的例子中, length 在创建实例的时候被初始化,因为它是一个常量存储属性,所以之后无法修改它的值。
let rangeOfFourItems = FixedLengthRange(firstValue: 0,length: 4) // 该区间表示整数0,1,2,3 rangeOfFourItems.firstValue = 6 // 尽管 firstValue 是个变量属性,这里还是会报错@H_675_29@因为 rangeOfFourItems 被声明成了常量(用 let 关键字),即使 firstValue 是一个变量属性,也无法再修改它了。 @H_675_29@这种行为是由于结构体(struct)属于 值类型 。当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。 @H_675_29@属于 引用类型 的类(class)则不一样。把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属性。
class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类。 这个类的初始化会消耗不少时间。 */ var filename = "data.txt" // 这是提供数据导入功能 } class DataManager { lazy var importer = DataImporter() var data = [String]() // 这是提供数据管理功能 } let manager = DataManager() manager.data.append("Some data") manager.data.append("Some more data") // DataImporter 实例的 importer 属性还没有被创建@H_675_29@DataManager 类包含一个名为 data 的存储属性,初始值是一个空的字符串( String )数组。虽然没有写出全部代码, DataManager 类的目的是管理和提供对这个字符串数组的访问。 @H_675_29@DataManager 的一个功能是从文件导入数据。该功能由 DataImporter 类提供, DataImporter 完成初始化需要消耗不少时间:因为它的实例在初始化时可能要打开文件,还要读取文件内容到内存。 @H_675_29@DataManager 也可能不从文件中导入数据就完成了管理数据的功能。所以当 DataManager 的实例被创建时,没必要创建一个 DataImporter 的实例,更明智的是当第一次用到 DataImporter 的时候才去创建它。 @H_675_29@由于使用了 lazy , importer 属性只有在第一次被访问的时候才被创建。比如访问它的属性 filename 时:
print(manager.importer.fileName) // DataImporter 实例的 importer 属性现在被创建了 // 输出 "data.txt”@H_675_29@注意:
struct Point { var x = 0.0,y = 0.0 } struct Size { var width = 0.0,height = 0.0 } struct Rect { var origin = Point() var size = Size() var center: Point { get { let centerX = origin.x + (size.width / 2) let centerY = origin.y + (size.height / 2) return Point(x: centerX,y: centerY) } set(newCenter) { origin.x = newCenter.x - (size.width / 2) origin.y = newCenter.y - (size.height / 2) } } } var square = Rect(origin: Point(x: 0.0,y: 0.0),size: Size(width: 10.0,height: 10.0)) let initialSquareCenter = square.center square.center = Point(x: 15.0,y: 15.0) print("square.origin is Now at (\(square.origin.X),\(square.origin.y))") // 输出 "square.origin is Now at (10.0,10.0)”@H_675_29@这个例子定义了 3 个结构体来描述几何形状: @H_675_29@1 Point 封装了一个 (x,y) 的坐标
struct AlternativeRect { var origin = Point() var size = Size() var center: Point { get { let centerX = origin.x + (size.width / 2) let centerY = origin.y + (size.height / 2) return Point(x: centerX,y: centerY) } set { origin.x = newValue.x - (size.width / 2) origin.y = newValue.y - (size.height / 2) } } }
注意:@H_675_29@必须使用 var 关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的。 let 关键字只用来声明常量属性,表示初始化后再也无法修改的值。 @H_675_29@只读计算属性的声明可以去掉 get 关键字和花括号:
struct Cuboid { var width = 0.0,height = 0.0,depth = 0.0 var volume: Double { return width * height * depth } } let fourByFiveByTwo = Cuboid(width: 4.0,height: 5.0,depth: 2.0) print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volumE)") // 输出 "the volume of fourByFiveByTwo is 40.0"@H_675_29@这个例子定义了一个名为 Cuboid 的结构体,表示三维空间的立方体,包含 width 、 height 和 depth 属性。结构体还有一个名为 volume 的只读计算属性用来返回立方体的体积。设置 volume 的值毫无意义,因为无法确定修改 width 、 height 和 depth 三者中的哪些值来匹配新的volume ,从而造成歧义。然而, Cuboid 提供一个只读计算属性来让外部用户直接获取体积是很有用的。
class StepCounter { var @R_646_10586@lSteps: Int = 0 { willSet(new@R_646_10586@lSteps) { print("About to set @R_646_10586@lSteps to \(new@R_646_10586@lSteps)") } didSet { if @R_646_10586@lSteps > oldValue { print("Added \(@R_646_10586@lSteps - oldvalue) steps") } } } } let stepCounter = StepCounter() stepCounter.@R_646_10586@lSteps = 200 // About to set @R_646_10586@lSteps to 200 // Added 200 steps stepCounter.@R_646_10586@lSteps = 360 // About to set @R_646_10586@lSteps to 360 // Added 160 steps stepCounter.@R_646_10586@lSteps = 896 // About to set @R_646_10586@lSteps to 896 // Added 536 steps@H_675_29@StepCounter 类定义了一个 Int 类型的属性 @R_646_10586@lSteps ,它是一个存储属性,包含 willSet 和 didSet 观察器。 @H_675_29@当 @R_646_10586@lSteps 设置新值的时候,它的 willSet 和 didSet 观察器都会被调用,甚至当新的值和现在的值完全相同也会调用。 @H_675_29@例子中的 willSet 观察器将表示新值的参数自定义为new@R_646_10586@lSteps ,这个观察器只是简单的将新的值输出。 @H_675_29@didSet 观察器在 @R_646_10586@lSteps 的值改变后被调用,它把新的值和旧的值进行对比,如果总的步数增加了,就输出一个消息表示增加了多少步。 didSet 没有为旧的值提供自定义名称,所以默认值 oldValue 表示旧值的参数名。 @H_675_29@注意:
struct SomeStructure { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 1 } } enum SomeEnumeration { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 6 } } class someClass { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 27 } class var overrideableComputedTypeProperty: Int { return 107 } }@H_675_29@注意:@H_854_197@ @H_675_29@例子中的计算型类型属性是只读的,但也可以定义可读可写的计算型类型属性,跟实例计算属性的语法类似。
print(SomeStructure.storedTypeProperty) // 输出 "Some value." SomeStructure.storedTypeProperty = "Another value." print(SomeStructure.storedTypeProperty) // 输出 "Another value.” print(SomeEnumeration.computedTypeProperty) // 输出 "6" print(someClass.computedTypeProperty) // 输出 "27"
以上是大佬教程为你收集整理的Swift学习第四枪全部内容,希望文章能够帮你解决Swift学习第四枪所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。