2016-10-06 13 views
14

Tôi đang di chuyển dự án từ Swift 2.2 đến Swift 3 và tôi đang cố gắng loại bỏ các loại dữ liệu Cocoa cũ khi có thể.Chuyển đổi từ thập phân sang hai lần trong Swift 3

Sự cố của tôi ở đây: di chuyển NSDecimalNumber đến Decimal.

Tôi từng cầu NSDecimalNumber-Double cả hai cách trong Swift 2.2:

let double = 3.14 
let decimalNumber = NSDecimalNumber(value: double) 

let doubleFromDecimal = decimalNumber.doubleValue 

Bây giờ, chuyển sang Swift 3:

let double = 3.14 
let decimal = Decimal(double) 

let doubleFromDecimal = ??? 

decimal.doubleValue không tồn tại, cũng không Double(decimal), thậm chí không decimal as Double ... Chỉ hack mà tôi nghĩ ra là:

let doubleFromDecimal = (decimal as NSDecimalNumber).doubleValue 

Nhưng đó sẽ là hoàn toàn ngu ngốc để cố gắng thoát khỏi NSDecimalNumber, và phải sử dụng nó một lần trong một thời gian ...

Vâng, hoặc là tôi đã bỏ lỡ một cái gì đó rõ ràng, và tôi xin lỗi vì lãng phí thời gian của bạn, hoặc có một lỗ hổng cần được giải quyết, theo ý kiến ​​của tôi ...

Cảm ơn trước sự giúp đỡ của bạn.

Chỉnh sửa: Không có gì thêm về chủ đề trên Swift 4.

Trả lời

3

Decimal trong Swift 3 không phải là NSDecimalNumber. Đó là NSDecimal, loại hoàn toàn khác.

Bạn chỉ nên tiếp tục sử dụng NSDecimalNumber như bạn đã làm trước đây.

+3

Thực ra, 'Thập phân' tương ứng với' NSDecimalNumber': 'Lớp phủ Swift vào khung nền tảng cung cấp cấu trúc thập phân, kết nối với lớp NSDecimalNumber. Loại giá trị thập phân cung cấp chức năng tương tự như loại tham chiếu NSDecimalNumber và hai có thể được sử dụng thay thế cho nhau trong mã Swift tương tác với các API mục tiêu-C https://developer.apple.com/reference/foundation/nsdecimalnumber – Alexander

+0

@AlexanderMomchliov , ngoại trừ nó không có phương thức 'NSDecimalNumber' nào có sẵn, do đó, để sử dụng chúng, bạn vẫn cần phải đúc' Decimal' thành 'NSDecimalNumber'. Nguồn: chỉ cần kiểm tra nó trong sân chơi. – user28434

+2

Vâng, tôi đã không yêu cầu. Tôi chỉ nói rằng giả định của bạn rằng 'thập phân' tương ứng với' NSDecimal', là sai. – Alexander

3

NSDecimalNumberDecimal được bắc cầu

Swift lớp phủ lên khuôn khổ Foundation cung cấp cấu trúc Decimal , mà cầu đến lớp NSDecimalNumber. Loại giá trị thập phân cung cấp chức năng tương tự như loại tham chiếu NSDecimalNumber và hai loại có thể được sử dụng thay thế cho nhau trong mã Swift tương tác với API mục tiêu-C. Hành vi này tương tự như cách Chuỗi cầu nối chuẩn, số và loại bộ sưu tập tiêu chuẩn cho các lớp Foundation tương ứng của chúng. Apple Docs

nhưng cũng giống như một số loại cầu bắc khác, một số yếu tố nhất định bị thiếu.

Để lấy lại các chức năng bạn có thể viết một phần mở rộng:

extension Decimal { 
    var doubleValue:Double { 
     return NSDecimalNumber(decimal:self).doubleValue 
    } 
} 

// implementation 
let d = Decimal(floatLiteral: 10.65) 
d.doubleValue 
+0

Câu hỏi vẫn giữ nguyên, ngay cả khi nó bị ẩn bởi một phần mở rộng. Bạn vẫn phải sử dụng loại thứ ba thay vì chỉ có 'Double' và 'Decimal' ... – Zaphod

5

Một giải pháp mà làm việc trong Swift 3 là để đúc các Decimal-NSNumber và tạo Double từ đó.

let someDouble = Double(someDecimal as NSNumber) 
+1

' let c = Double (cắt ngắn: a là NSNumber) 'trong Swift 4 – vikingosegundo

+0

@vikingosegundo Đó là Swift 4. Trong Swift 3 bạn không cần 'cắt xén'. – rmaddy

+0

vâng, đúng vậy. Tôi vô tình nhấn Enter quá sớm. – vikingosegundo

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