在定義了配送區(qū)域和實(shí)例化的值之后囱怕,你可能想知道如何使用這些值茧痒。就像使用字符串雇庙、數(shù)組和字典一樣鱼鼓,使用點(diǎn)語法訪問成員:
print(storeArea.radius) // 4.0
還可以使用點(diǎn)語法訪問成員的成員:
print(storeArea.center.x) // 2
類似于你可以使用點(diǎn)語法讀取值,你也可以指定它們的值宣蔚。如果一個(gè)批薩位置的配送半徑變得更大向抢,你可以將新值分配給現(xiàn)有的屬性:
storeArea.radius = 250
常量和變量的語義在確定是否可以給屬性分配值起著重要的作用。在這種情況下胚委,你可以指定radius挟鸠,因?yàn)槟阌胿ar來聲明它,另一方面亩冬,你使用let聲明了center兄猩,所以你不能修改它。因此你的DeliveryArea結(jié)構(gòu)允許一個(gè)比薩餐廳的配送范圍被改變鉴未,但不能改變它的位置!
除了選擇屬性應(yīng)該是變量或常量之外,如果你希望在它初始化之后修改它鸠姨,你還必須將結(jié)構(gòu)本身聲明為一個(gè)變量:
let fixedArea = DeliveryArea(center: storeLocation, radius: 4)
// Error: Cannot assign to property
fixedArea.radius = 250
該代碼導(dǎo)致編譯器發(fā)生錯(cuò)誤铜秆。因?yàn)槟銓ixedArea從一個(gè)常量變?yōu)橐粋€(gè)var變量,使其可變讶迁。
現(xiàn)在连茧,你已經(jīng)了解了如何控制結(jié)構(gòu)中屬性的可變性。
方法
使用一些結(jié)構(gòu)的功能巍糯,你現(xiàn)在可以做一個(gè)披薩配送范圍的計(jì)算器啸驯,看起來像這樣:
let areas = [
DeliveryArea(center: Location(x: 2, y: 4), radius: 2.5),
DeliveryArea(center: Location(x: 9, y: 7), radius: 4.5)
]
func isInDeliveryRange(_ location: Location) -> Bool {
for area in areas {
let distanceToStore =
distance(from: (area.center.x, area.center.y),
to: (location.x, location.y))
if distanceToStore < area.radius {
return true
}
}
return false
}
let customerLocation1 = Location(x: 8, y: 1)
let customerLocation2 = Location(x: 5, y: 5)
print(isInDeliveryRange(customerLocation1)) // false
print(isInDeliveryRange(customerLocation2)) // true
在本例中,有一個(gè)數(shù)組區(qū)域和一個(gè)函數(shù)祟峦,它使用該數(shù)組來確定客戶的位置是否在這些區(qū)域內(nèi)罚斗。
在范圍內(nèi)是你想知道的關(guān)于某家餐廳的信息。如果送貨區(qū)能告訴你餐館能不能送貨到一個(gè)地方宅楞,那就太好了针姿。
就像一個(gè)結(jié)構(gòu)可以有常量和變量一樣,它也可以定義自己的函數(shù)厌衙。在你的playground上距淫,定位配送區(qū)域的實(shí)現(xiàn)。在關(guān)閉大括號(hào)之前婶希,添加以下代碼:
func contains(_ location: Location) -> Bool {
let distanceFromCenter =
distance(from: (center.x, center.y),
to: (location.x, location.y))
return distanceFromCenter < radius
}
這定義了一個(gè)函數(shù)contains榕暇,它現(xiàn)在是DeliveryArea的成員。屬于類型成員的函數(shù)稱為方法。注意contains如何使用當(dāng)前l(fā)ocation的center和radius屬性彤枢。這種對(duì)屬性和其他成員的隱式訪問使得方法與常規(guī)函數(shù)不同狰晚。你將在以后了解更多關(guān)于方法的知識(shí)。
就像其他結(jié)構(gòu)成員一樣堂污,你可以使用點(diǎn)語法訪問方法:
let area = DeliveryArea(center: Location(x: 5, y: 5), radius: 4.5)
let customerLocation = Location(x: 2, y: 2)
area.contains(customerLocation) // true