52 lines
1.6 KiB
Swift
52 lines
1.6 KiB
Swift
//
|
||
// CircleMember.swift
|
||
// QuickLocation
|
||
//
|
||
|
||
import Foundation
|
||
import CoreLocation
|
||
|
||
struct CircleMember {
|
||
let id: String
|
||
let name: String
|
||
let avatar: String
|
||
let isOnline: Bool
|
||
let isOwner: Bool
|
||
let coordinate: CLLocationCoordinate2D
|
||
let address: String
|
||
let heading: Double
|
||
let lastUpdateText: String
|
||
|
||
var isCurrentUser: Bool { id == "current" }
|
||
}
|
||
|
||
extension CircleMember {
|
||
/// 从 GroupMemberModel 创建地图标注数据
|
||
init(member: GroupMemberModel, isOwner: Bool) {
|
||
id = member.user_id
|
||
name = member.nick_name
|
||
avatar = member.head_pic
|
||
isOnline = member.is_online
|
||
self.isOwner = isOwner
|
||
let (coord, addr) = Self.parsePosition(member.last_position)
|
||
coordinate = coord
|
||
address = addr
|
||
heading = 0
|
||
lastUpdateText = member.is_online ? "在线" : "离线"
|
||
}
|
||
|
||
/// 解析 last_position:格式 "lat:lng:address"
|
||
private static func parsePosition(_ position: String) -> (CLLocationCoordinate2D, String) {
|
||
guard !position.isEmpty else { return (kCLLocationCoordinate2DInvalid, "") }
|
||
let parts = position.components(separatedBy: ":")
|
||
guard parts.count >= 2,
|
||
let lat = Double(parts[0]),
|
||
let lng = Double(parts[1]),
|
||
CLLocationCoordinate2DIsValid(CLLocationCoordinate2D(latitude: lat, longitude: lng)) else {
|
||
return (kCLLocationCoordinate2DInvalid, "")
|
||
}
|
||
let addr = parts.count >= 3 ? parts[2] : ""
|
||
return (CLLocationCoordinate2D(latitude: lat, longitude: lng), addr)
|
||
}
|
||
}
|