Swift 系统学习 19 结构体的默认构造方法和自定义构造方法

//: 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?












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值