//: Playground - noun: a place where people can play
import UIKit
/*
* 本节主要内容:
* 1.结构体的默认构造方法和自定义构造方法
*/
/*
* 1.默认构造init方法:没有添加任何的init方法, 由编译器自动生成的方法; 包含所有属性的init方法
* 1.1 默认构造方式失效: 当在声明结构体阶段, 就默认给属性赋值
* 2.没有添加init构造方法, 原则就是使用编译器自动创造init方法
*/
struct Location {
var latitude: Double = 0.0
var longitude: Double //= 0.0
}
// 第一步: 没有给属性初始值
//var beijingLocation = Location(latitude: 39.123, longitude: 116.321)
// 第二步: 给所有属性初始值
//var shanghaiLocation = Location()
//shanghaiLocation.latitude = 36.234
//shanghaiLocation.longitude
// 第三步: 给部分属性初始值
var shenzhenLocation = Location(latitude: 33.123, longitude: 115.345)
/*
* 添加自定义的init方法:
* 1.要求:方法名只能是init; 参数类型没有要求(不一定和编译器提供的方法一样); 方法声明不能有返回值(->; return)
* 2.作用: 构造/实例化对象(属性进行赋值)
* 3.如果添加自定义的init方法, 默认构造方法失效
*/
struct LocationNew {
var latitude: Double = 0.0
var longitude: Double = 0.0
// 添加自定义的构造方法
// 假定参数格式: "39.123,116.456"
// 错误参数格式: "39.123*116.456"
init(coordinateString: String) {
// 获取子字符串
// 1.获取逗号所在的index
let commaRange = coordinateString.range(of: ",")
let commaIndex = coordinateString.index((commaRange?.lowerBound)!, offsetBy: 0)
// 2.subString to获取纬度
let firstElement = coordinateString.substring(to: commaIndex)
// 3.subString from获取经度
let secondElement = coordinateString.substring(from: coordinateString.index(commaIndex, offsetBy: 1))
latitude = Double(firstElement)!
longitude = Double(secondElement)!
}
// init方法可以多个
// 原则: 在编译没有歧义的情况下, self.可以省略
init(latitude: Double, longitude: Double) {
self.latitude = latitude
self.longitude = longitude
}
init() {
latitude = 0.0
longitude = 0.0
}
}
// 实例化, 调用自定义的init方法
var newLocation = LocationNew(coordinateString: "39.123,116.456")
newLocation.latitude
newLocation.longitude
var beijingLocation = LocationNew()
beijingLocation.latitude
var chengduLocation = LocationNew(latitude: 35.123, longitude: 119.335)
// 容错处理: 可以处理不符合要求的字符串的格式, init应该是一个可失败的构造方法; init?
Swift 系统学习 19 结构体的默认构造方法和自定义构造方法
最新推荐文章于 2024-05-24 14:09:27 发布