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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.