2017-06-19 19 views
5

Dường như với tôi có một cách đơn giản để thực hiện chuyển đổi tùy chọn từ String thành số Int trong Swift nhưng tôi không thể tìm ra.Cách đơn giản nhất để chuyển đổi một chuỗi tùy chọn thành Int tùy chọn trong Swift

valueString? và tôi cần trả lại Int?.

Về cơ bản tôi muốn làm điều này, nhưng không có soạn sẵn:

return value != nil ? Int(value) : nil 

Tôi cố gắng này, mà dường như để phù hợp với công ước của Swift và sẽ được tốt đẹp và súc tích, nhưng nó không nhận ra cú pháp:

return Int?(value) 
+1

Làm thế nào về 'Int (giá trị ?? "") ' – vacawama

+0

Vâng, tốt hơn. Nó rất kỳ quặc với tôi rằng bộ khởi tạo sẽ không chấp nhận một tùy chọn và sẽ chỉ trả về nil nếu bất kỳ nil nào được truyền vào. Tôi đoán hệ thống kiểu Swift sẽ có một cơn đau tim. – devios1

+0

Tôi đã cập nhật câu trả lời của mình bằng phần mở rộng Int làm điều đó. – vacawama

Trả lời

5

Bạn có thể sử dụng nil coalescing hành?? để unwrap String? và sử dụng một giá trị mặc định "" mà bạn biết sẽ sản xuất nil:

return Int(value ?? "") 

cách tiếp cận khác: Int initializer mà sẽ đưa String?

Từ nhận xét:

Nó rất kỳ lạ với tôi rằng initializer sẽ không chấp nhận một tùy chọn và sẽ chỉ trả lại con số không nếu có con số không đã được thông qua.

Bạn có thể tạo trình khởi tạo của riêng mình cho Int thực hiện điều đó:

extension Int { 
    init?(_ value: String?) { 
     guard let value = value else { return nil } 
     self.init(value) 
    } 
} 

và bây giờ bạn chỉ có thể làm:

var value: String? 
return Int(value) 
+1

Tôi nghĩ rằng đây là cách tiếp cận chính xác và có khả năng đọc tốt hơn –

+1

Cách tiếp cận kết hợp 'nil' thực sự gọn gàng và dễ đọc, nhưng tôi tin rằng nó chỉ ra rằng phương pháp' flatMap (_ :) '(so với' nil' coalescing một) sẽ không gọi một cuộc gọi chắc chắn thất bại (đi qua chữ '" "') để khởi tạo có sẵn 'Int' (bởi' String') nếu 'giá trị' là' nil'. Vì lý do này, imho, phương thức 'flatMap (_ :)', hoặc phương thức thứ hai ở trên (initializer tùy chỉnh), là thích 'nil' coalescing. – dfri

+1

Phương thức init tùy chỉnh có thể được đơn giản hóa thành 'guard let value = value else {return nil}; self.init (giá trị) ' –

8

Bạn có thể sử dụng phương pháp flatMap() của Optional:

func foo(_ value: String?) -> Int? { 
    return value.flatMap { Int($0) } 
} 

Nếu value == nil thì flatMap trả lại nil. Nếu không nó đánh giá Int($0) nơi $0 là giá trị nào, và trả kết quả (có thể nil nếu chuyển đổi thất bại):

print(foo(nil) as Any)  // nil 
print(foo("123") as Any) // Optional(123) 
print(foo("xyz") as Any) // nil 
+0

Ngoài ra 'bản đồ' cũng giống nhau. – Sulthan

+0

@Sulthan: 'value.map {Int ($ 0)}' sẽ đánh giá tùy chọn lồng nhau, ví dụ: Tùy chọn (Tùy chọn (123)) –

+0

@MartinR Ah vâng, bạn nói đúng, đã không nhận ra tùy chọn bên trong! – Sulthan

2

Với Chuỗi mở rộng mà bạn không nên lo lắng về string == nil

extension String { 
    func toInt() -> Int? { 
    return Int(self) 
    } 
} 

Cách sử dụng:

var nilString: String? 
print("".toInt())   // nil 
print(nilString?.toInt()) // nil 
print("123".toInt())  // Optional(123) 
Các vấn đề liên quan