Skip to content

Commit dc89764

Browse files
committed
adding convenience streetAddress property
1 parent 9dcd38e commit dc89764

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

Sources/MapboxGeocoder/MBPlacemark.swift

+23-14
Original file line numberDiff line numberDiff line change
@@ -494,21 +494,14 @@ open class GeocodedPlacemark: Placemark {
494494
}
495495

496496
@objc open var formattedName: String {
497-
let text = super.name
498-
// For address features, `text` is just the street name. Look through the fully-qualified address to determine whether to put the house number before or after the street name.
499-
if let houseNumber = address, scope == .address {
500-
let streetName = text
501-
let reversedAddress = "\(streetName) \(houseNumber)"
502-
if qualifiedNameComponents.contains(reversedAddress) {
503-
return reversedAddress
504-
} else {
505-
return "\(houseNumber) \(streetName)"
506-
}
507-
} else if scope == .address, precision == .intersection {
508-
// For intersection features, `text` is just the first street name. The first line of the fully qualified address contains the cross street too.
509-
return qualifiedNameComponents.first ?? text
497+
guard scope == .address else {
498+
return name
499+
}
500+
if precision == .intersection {
501+
// For intersection features, `name` is just the first street name. The first line of the fully qualified address contains the cross street too.
502+
return qualifiedNameComponents.first ?? name
510503
} else {
511-
return text
504+
return streetAddress ?? name
512505
}
513506
}
514507

@@ -546,6 +539,22 @@ open class GeocodedPlacemark: Placemark {
546539
return clippedAddressLines
547540
}
548541

542+
@objc open var streetAddress: String? {
543+
guard scope == .address else {
544+
return properties?.address ?? address
545+
}
546+
guard let address = address else {
547+
return name
548+
}
549+
// For address features, `address` is a house number and `name` is just a street name. Look through the fully-qualified address to determine whether to put the house number after or before the street name (i.e. Chinese addresses).
550+
let streetAddress = "\(name) \(address)"
551+
if qualifiedNameComponents.contains(streetAddress) {
552+
return streetAddress
553+
} else {
554+
return "\(address) \(name)"
555+
}
556+
}
557+
549558
#if canImport(Contacts)
550559
@objc open override var postalAddress: CNPostalAddress? {
551560
let postalAddress = CNMutablePostalAddress()

Tests/MapboxGeocoderTests/ForwardGeocodingTests.swift

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class ForwardGeocodingTests: XCTestCase {
6363
XCTAssertEqual(addressPlacemark.place?.name, "Wasaga Beach", "forward geocode should populate locality")
6464
XCTAssertEqual(addressPlacemark.thoroughfare, "Pennsylvania Ave", "forward geocode should populate thoroughfare")
6565
XCTAssertNil(addressPlacemark.subThoroughfare, "forward geocode should not populate sub-thoroughfare for street-only result")
66+
XCTAssertEqual(addressPlacemark.streetAddress, "Pennsylvania Ave", "forward geocode should populate street address")
6667

6768
XCTAssertNotNil(addressPlacemark.addressDictionary)
6869
let addressDictionary = addressPlacemark.addressDictionary!

Tests/MapboxGeocoderTests/ReverseGeocodingTests.swift

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ReverseGeocodingTests: XCTestCase {
6060
XCTAssertEqual(pointOfInterestPlacemark.place?.name, "Independence", "reverse geocode should populate place")
6161
XCTAssertNil(pointOfInterestPlacemark.thoroughfare, "reverse geocode for POI should not populate thoroughfare")
6262
XCTAssertNil(pointOfInterestPlacemark.subThoroughfare, "reverse geocode for POI should not populate sub-thoroughfare")
63+
XCTAssertEqual(pointOfInterestPlacemark.streetAddress, "2850 CR 3100", "reverse geocode for POI should populate street address")
6364
XCTAssertEqual(pointOfInterestPlacemark.wikidataItemIdentifier, "Q82112")
6465

6566
XCTAssertNotNil(pointOfInterestPlacemark.addressDictionary)
@@ -141,5 +142,6 @@ class ReverseGeocodingTests: XCTestCase {
141142

142143
XCTAssertEqual(addressPlacemark?.name, decodedAddressPlacemark.name)
143144
XCTAssertEqual(addressPlacemark?.formattedName, decodedAddressPlacemark.formattedName)
145+
XCTAssertEqual(addressPlacemark?.streetAddress, "850 Eldorado Street", "reverse geocode should populate street address")
144146
}
145147
}

0 commit comments

Comments
 (0)