2016-11-02 16 views
10


Tôi có chuỗi tùy chọn và muốn chuyển đổi thành gấp đôi.
này làm việc trong Swift 2, nhưng kể từ khi chuyển đổi sang Swift 3, tôi nhận được giá trị của 0.Chuyển đổi chuỗi tùy chọn thành gấp đôi trong Swift 3

var dLati = 0.0 
dLati = (latitude as NSString).doubleValue 

Tôi có kiểm tra và vĩ độ có một giá trị chuỗi tùy chọn của một cái gì đó giống như -80,234543218675654, nhưng giá trị dLati là 0

*************** ok, cập nhật mới cho rõ ràng *****************
Tôi có một bộ điều khiển xem mà tôi có một nút trong đó, và khi nút được chạm vào, nó sẽ gọi một bộ điều khiển xem khác và chuyển một vài giá trị cho nó đây là mã cho khung nhìn đầu tiên

var currentLatitude: String? = "" 
var currentLongitude: String? = "" 
var deviceName = "" 
var address = "" 
// somewhere in the code, currentLatitude and currentLongitude are get set 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "map" { 
     let destViewController : MapViewController = segue.destination as! MapViewController 
     print(currentLongitude!) // Print display: Optional(-80.192279355363768) 
     print(currentLatitude!) // Print display: Optional(25.55692663937162) 
     destViewController.longitude = currentLongitude! 
     destViewController.latitude = currentLatitude! 
     destViewController.deviceName = deviceName 
     destViewController.address = address 
    } 
} 

Đây là mã cho bộ điều khiển xem thứ hai gọi là MapViewController

var longitude: String? = " " 
    var latitude: String? = "" 
    . 
    . 
    override func viewDidLoad() { 
     if let lat = latitude { 
      print(lat) // Print display: optiona(25.55692663937162) 
      dLati = (lat as NSString).doubleValue 
      print(dLati) // Print display: 0.0 
     } 
     . 
     . 
    } 

Cảm ơn Borna

+2

gì 'latitude' đến từ đâu? Nó được tuyên bố như thế nào? Có đảm bảo luôn luôn có giá trị số không hợp lệ không? – rmaddy

Trả lời

1

Mã này hoạt động tốt.

var dLati = 0.0 
let latitude: String? = "-80.234543218675654" 
if let strLat = latitude { 
    dLati = Double(strLat)! 
} 
+5

Điều này rất nguy hiểm. Chỉ vì giá trị 'vĩ độ' của OP xảy ra có giá trị cụ thể này trong một trường hợp không có nghĩa là giá trị này luôn có giá trị hợp lệ. Tháo dỡ thích hợp nên được thực hiện. – rmaddy

+1

Vẫn không hoạt động. Trong trình gỡ lỗi nếu tôi in mô tả vĩ độ, tôi nhận được điều này -> In mô tả về self.latitude: "Tùy chọn (26.55692667237162)" .Và giá trị của dLati -> Mô tả in của self.dLati: 0.0 – borna

+0

@borna Bạn phải cởi mở giá trị của vĩ độ trước. Kiểm tra câu trả lời của tôi. Cũng cung cấp một số nguồn mà bạn nhận được giá trị vĩ độ và trong đó loại –

4

Unwrap giá trị latitude một cách an toàn và sau đó sử dụng

var dLati = 0.0 

if let lat = latitude { 
    dLati = (lat as NSString).doubleValue 
} 
0

Đừng chuyển nó sang một NSString, bạn có thể buộc nó vào một Double nhưng có một dự phòng nếu nó không thành công. Một cái gì đó như thế này:

let aLat: String? = "11.123456" 
let bLat: String? = "11" 
let cLat: String? = nil 

let a = Double(aLat!) ?? 0.0 // 11.123456 
let b = Double(bLat!) ?? 0.0 // 11 
let c = Double(cLat!) ?? 0.0 // 0 

Vì vậy, trong trường hợp của bạn:

dLati = Double(latitude!) ?? 0.0 

Cập nhật: Xử lý nil giá trị làm như sau (lưu ý rằng chúng ta hãy cLat là nil:

// Will succeed 
if let a = aLat, let aD = Double(aLat!) { 
    print(aD) 
} 
else { 
    print("failed") 
} 

// Will succeed 
if let b = bLat, let bD = Double(bLat!) { 
    print(bD) 
} 
else { 
    print("failed") 
} 

// Will fail 
if let c = cLat, let cD = Double(cLat!) { 
    print(cD) 
} 
else { 
    print("failed") 
} 
+2

Man, nó sẽ sụp đổ nếu bất kỳ giá trị 'aLat',' bLat' hoặc 'cLat' là nil –

+0

let dLatitude = Double (latitude ??" ") ?? 0.0 – user3441734

+0

Trên thực tế, tùy chọn là một phần của chuỗi. Bạn không chắc chắn cách tùy chọn đã được thêm vào chuỗi? Cách tôi cố định nó là như thế này. vĩ độ là chuỗi này "Tùy chọn (26.33691567239162)" sau đó tôi đã làm điều này ---> let start = latitude.index (vĩ độ.startIndex, offsetBy: 9) cho end = latitude.index (vĩ độ.endIndex, offsetBy: -1) let range = start .. 26.33691567239162 – borna

17

Một cách an toàn để đạt được điều này mà không cần sử dụng các loại Foundation đang sử dụng bộ khởi tạo của Double:

if let lat = latitude, let doubleLat = Double(lat) { 
    print(doubleLat) // doubleLat is of type Double now 
} 
0

Trên thực tế từ bắt buộc là một phần của chuỗi. Bạn không chắc chắn cách nó được thêm vào trong chuỗi? Nhưng cách tôi cố định nó là như thế này. vĩ độ là chuỗi này "Tùy chọn (26,33691567239162)", sau đó tôi đã làm mã này

let start = latitude.index(latitude.startIndex, offsetBy: 9) 
let end = latitude.index(latitude.endIndex, offsetBy: -1) 
let range = start..<end 
latitude = latitude.substring(with: range) 

và nhận được này là giá trị cuối cùng
26,33691567239162

0

Trong nhanh chóng 3.1, chúng ta có thể kết hợp mở rộng và bê tông Constrained Extensions

extension Optional where Wrapped == String 
{ 
    var asDouble: Double 
    { 
     return NSString(string: self ?? "").doubleValue 
    } 
} 

Hoặc

extension Optional where Wrapped == String 
{ 
     var asDouble: Double 
     { 
      return Double(str ?? "0.00") ?? 0.0 
     } 
} 
1

Khi bạn nhận được một chuỗi với một cái gì đó giá trị tăng gấp đôi như thế này

"Optional(12.34567)" 

Bạn có thể sử dụng một Regex mà lấy ra giá trị kép từ chuỗi. Đây là mã ví dụ cho một Regex nếu chuỗi là "Optional(12.34567)":

let doubleLatitude = location.latitude?.replacingOccurrences(of: "[^\\.\\d+]", with: "", options: [.regularExpression]) 
1

Bạn có thể làm điều này chỉ đơn giản là trong một dòng.

var latitude: Double = Double("-80.234543218675654") ?? 0.0 

này tạo ra một biến có tên vĩ độ đó là loại kép được hoặc khởi tạo với một đúp thành công từ String hoặc được gán giá trị dự phòng của 0.0

Các vấn đề liên quan