Cách sử dụng cấu trúc Swift trong Objective-C


97

Đơn giản là tôi có một cấu trúc lưu trữ các hằng số ứng dụng như bên dưới:

struct Constant {

    static let ParseApplicationId = "xxx"
    static let ParseClientKey = "xxx"

    static var AppGreenColor: UIColor {
        return UIColor(hexString: "67B632")
    }
}

Constant.ParseClientKeyVí dụ, các hằng số này có thể được sử dụng trong mã Swift bằng cách gọi . Nhưng trong mã của tôi, nó cũng chứa một số lớp Objective-C. Vì vậy, câu hỏi của tôi là làm thế nào để sử dụng các hằng số này trong mã Objective-C?

Nếu cách khai báo hằng này không tốt thì cách tốt nhất để tạo hằng số toàn cục được sử dụng trong cả mã Swift và Objective-C là gì?


22
Vui lòng làm theo kiểu mã nhanh phổ biến và sử dụng một chữ cái thường để bắt đầu mã định danh let / var của bạn.
Nikolai Ruhe

4
@NikolaiRuhe Đây có phải là kiểu không đúng cho các thuộc tính tĩnh của cấu trúc không? Nhiều như thế UIControlEvents.TouchUpInsidenào?
Luke Rogers

1
@NikolaiRuhe Hãy xem phần khai báo Swift: developer.apple.com/library/ios/documentation/UIKit/Reference/… - đó chắc chắn là một cấu trúc.
Luke Rogers

1
@LukeRogers Đó là do Swift 2.0 đã thay đổi cách nhập các NS_OPTIONSkiểu enums. Về mặt ngữ nghĩa UIControlEventvẫn là một kiểu liệt kê.
Nikolai Ruhe

5
@NikolaiRuhe LukeRogers: Định không hỏi về vấn đề đó và hầu hết người xem chúng tôi không nhấp vào đây để đọc về vấn đề đó.
original_username

Câu trả lời:


114

Đáng buồn là bạn không thể hiển thị structhoặc các biến toàn cục cho Objective-C. xem tài liệu .

Hiện tại, IMHO, cách tốt nhất là như sau:

let ParseApplicationId = "xxx"
let ParseClientKey = "xxx"
let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)

@objc class Constant: NSObject {
    private init() {}

    class func parseApplicationId() -> String { return ParseApplicationId }
    class func parseClientKey() -> String { return ParseClientKey }
    class func appGreenColor() -> UIColor { return AppGreenColor }
}

Trong Objective-C, bạn có thể sử dụng chúng như sau:

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];

Cũng có thể sử dụng Swift?
khunshan

@khunshan Có. Có thể truy cập trực tiếp ParseClientKeyhoặc thông qua lớp họcConstant.clientKey()
Fabian

7
Nên sử dụng@objc class Constant: NSObject
William Hu

1
Điều này hoạt động nhưng trong Swift 4, tôi cũng cần đặt @objctrước mỗi class funcđể có thể gọi chúng từ mã Objective C.
ElectroBuddha

2
@ElectroBuddha Bạn có thể thực hiện @objcMemberstrên lớp để hiển thị toàn bộ lớp theo mã Objective-C.
user1898712

19

Tại sao không tạo một tệp có cả a structvà an @objc class, một cái gì đó như thế này:

import UIKit

extension UIColor {
    convenience init(hex: Int) {
        let components = (
            R: CGFloat((hex >> 16) & 0xff) / 255,
            G: CGFloat((hex >> 08) & 0xff) / 255,
            B: CGFloat((hex >> 00) & 0xff) / 255
        )
        self.init(red: components.R, green: components.G, blue: components.B, alpha: 1)
    }
}

extension CGColor {
    class func colorWithHex(hex: Int) -> CGColorRef {
        return UIColor(hex: hex).CGColor
    }
}

struct Constant {
    static let kParseApplicationId = "5678"
    static let kParseClientKey = "1234"
    static var kAppGreenColor: UIColor { return UIColor(hex:0x67B632) }
    static var kTextBlackColor: UIColor { return UIColor(hex:0x000000) }
    static var kSomeBgBlueColor: UIColor { return UIColor(hex:0x0000FF) }
    static var kLineGrayCGColor: CGColor { return CGColor.colorWithHex(0xCCCCCC) }
    static var kLineRedCGColor: CGColor { return CGColor.colorWithHex(0xFF0000) }
}


@objc class Constants: NSObject {
    private override init() {}

    class func parseApplicationId() -> String { return Constant.kParseApplicationId }
    class func parseClientKey() -> String { return Constant.kParseClientKey }
    class func appGreenColor() -> UIColor { return Constant.kAppGreenColor }
    class func textBlackColor() -> UIColor { return Constant.kTextBlackColor }
    class func someBgBlueColor() -> UIColor { return Constant.kSomeBgBlueColor }
    class func lineGrayCGColor() -> CGColor { return Constant.kLineGrayCGColor }
    class func lineRedCGColor() -> CGColor { return Constant.kLineRedCGColor }
}

Để sử dụng trong các tệp Objective-C, hãy thêm điều này khi bạn cần sử dụng hằng số:

#import "ProjectModuleName-Swift.h"

Sử dụng nhanh chóng:

self.view.backgroundColor = Constant.kAppGreenColor

Cách sử dụng Objective-C:

self.view.backgroundColor = [Constants appGreenColor];

Bằng cách này, bạn có thể cập nhật màu sắc, văn bản mặc định, url dịch vụ web cho toàn bộ ứng dụng ở một nơi.


1
Tôi không rõ ràng ngay lập tức rằng chúng tôi có thể cuộn câu trả lời của bạn để khám phá phần mục tiêu-c!
Cœur

1

Bạn nên đặt câu lệnh let ở chế độ riêng tư nếu bạn muốn tạo các kiểu Swift khác trong mã của mình để chỉ truy cập các hằng số này qua lớp:

private let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)

@objc class Constant {
    class func appGreenColor() -> UIColor { return AppGreenColor }
}

Trong Swift, bạn có thể sử dụng chúng như sau:

UIColor *greenColor = Constant.appGreenColor

Dòng sau sẽ không biên dịch nữa bây giờ vì câu lệnh let là riêng tư:

UIColor *greenColor = appGreenColor

1

Mặc dù điều này có thể muộn hoặc thừa, nhưng tôi có thể làm cho nó hoạt động bằng đoạn mã sau:

@objcMembers class Flags: NSObject {
    static let abcEnabled = false
    static let pqrEnabled = false
    .
    .
    .
}

Rõ ràng, để sử dụng trong mã objc c, bạn phải thực hiện #import "ProjectModuleName-Swift.h"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.