2014-06-14 14 views
20

Trong một lớp Swift có nguồn gốc từ một khuôn khổ dựa obj-C (nhưng có thể chỉ là một cách dễ dàng là một lớp Swift với một thuộc tính @objc) Tôi tuyên bố hai thuộc tính lưu trữ:Có thể một Int tùy chọn Swift (Int?) Được tiếp xúc với Objective-C thông qua cầu nối không?

var optInt: Int? 
var optString: String? 

Chỉ OPTSTRING đã được tiếp xúc với obj -C thông qua tiêu đề -Swift.h được tạo.

Chuỗi? có lẽ là tốt bởi vì nó được tiếp xúc bằng cách sử dụng một đối tượng NSString có thể là nil, do đó cầu nối có cách để biểu diễn không có giá trị nào.

Nếu tôi xóa? từ optInt nó được tiếp xúc với kiểu NSInteger, vì vậy tôi có thể thấy rằng đối với các số nguyên không bắt buộc, nó tránh các đối tượng và các kiểu giá trị của kiểu cầu, nhưng điều này có nghĩa là một Int? không thể được tiếp xúc?

Tôi dường như không tìm thấy bất kỳ tài liệu nào nêu rõ trường hợp này. Có một danh sách toàn bộ các tính năng Swift không tương thích ở đây mà điều này không xuất hiện trên: Using Swift from Objective-C

Trường hợp sử dụng ở đây là tình huống cổ điển yêu cầu chuyển một ID số có thể hợp pháp bằng không. Trong thế giới pre-Swift NSNumber và nil chính xác là cách tôi thực hiện điều này, nhưng nó chỉ cảm thấy sai khi cố gắng chuyển một lớp sang Swift nhưng sau đó treo vào các loại Obj-C trong lớp Swift đặc biệt vì lý do này.

Tôi cho rằng tôi đã dự tính rằng một Int? không giống như Int sẽ cầu như một NSNumber trong nền, với giá trị tiềm năng nil của nó ăn yếu tố "không có giá trị" của tùy chọn trong Swift.

Có bất kỳ điều gì tôi thiếu ở đây không? Để nhắc lại, liệu Swift Optional Int (Int?) Có được tiếp xúc với Objective-C thông qua cầu nối không?

+3

tôi sẽ cố gắng 'NSNumber' với một' intValue' bên trong. – dasblinkenlight

+1

Nếu tiêu đề được tạo không hoạt động với thuộc tính đó, thì có vẻ như câu trả lời là "không". Tuy nhiên, vì Swift chưa được hoàn tất, hãy gửi một lỗi cho Apple nếu bạn nghĩ rằng có một cách tiếp cận hợp lý. (Vấn đề với việc hiển thị nó là 'NSNumber *' là bạn có thể lưu trữ 'NSNumber' không tương thích 'Int' với nó từ Objective-C.) –

+1

Bạn có thể tạo thuộc tính' NSNumber? 'Được tính toán để bọc' Int? 'Tài sản. Hàm getter sẽ trả về biến 'Int?'. Bộ setter sẽ đặt biến 'Int' từ' - [NSNumber integerValue] '. –

Trả lời

7

Sự cố khi hiển thị thuộc tính Int?NSNumber* là bạn có thể lưu trữ không Int tương thích NSNumber cho nó từ Mục tiêu-C.

Bạn có thể đặt thuộc tính NSNumber? được tính toán để bao bọc thuộc tính Int? của mình. Bộ thu sẽ chỉ trả về biến số Int?. Setter sẽ đặt biến số Int từ -[NSNumber integerValue].

5

Dưới đây là một câu trả lời cụ thể cho các giải pháp đã nêu ở trên:

private var _number: Int? 
public var number: NSNumber? { 
    get { 
     return _number as NSNumber? 
    } 
    set(newNumber) { 
     _number = newNumber?.intValue 
    } 
} 

// In case you want to set the number in the init 
public init(number: NSNumber?) { 
    _number = number?.intValue 
} 
Các vấn đề liên quan