วิธีใช้ Swift struct ใน Objective-C


97

ฉันมีโครงสร้างที่เก็บค่าคงที่ของแอปพลิเคชันดังต่อไปนี้:

struct Constant {

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

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

ค่าคงที่เหล่านี้สามารถใช้ในรหัส Swift ได้โดยการเรียกConstant.ParseClientKeyเช่น แต่ในโค้ดของฉันมันยังมีคลาส Objective-C อยู่ด้วย ดังนั้นคำถามของฉันคือจะใช้ค่าคงที่เหล่านี้ในรหัส Objective-C ได้อย่างไร?

หากวิธีการประกาศค่าคงที่ไม่ดีวิธีใดที่ดีที่สุดในการสร้างค่าคงที่ทั่วโลกเพื่อใช้ในโค้ด Swift และ Objective-C


22
โปรดทำตามรูปแบบรหัสด่วนทั่วไปและใช้ตัวอักษรพิมพ์เล็กเพื่อเริ่มตัวระบุ let / var ของคุณ
Nikolai Ruhe

4
@NikolaiRuhe นี่ไม่ใช่สไตล์ที่ถูกต้องสำหรับคุณสมบัติคงที่ของโครงสร้างหรือไม่? เหมือนมากUIControlEvents.TouchUpInside?
Luke Rogers

1
@NikolaiRuhe ดูคำประกาศ Swift: developer.apple.com/library/ios/documentation/UIKit/Reference/… - มันเป็นโครงสร้างที่แน่นอน
Luke Rogers

1
@LukeRogers นั่นเป็นเพราะวิธีที่เปลี่ยนไปของ Swift 2.0 ในการนำเข้าNS_OPTIONSสไตล์ enums ความหมายUIControlEventยังคงเป็นประเภทการแจงนับ
Nikolai Ruhe

5
@NikolaiRuhe LukeRogers: Dinh ไม่ได้ถามเกี่ยวกับปัญหานั้นและผู้ชมส่วนใหญ่ไม่ได้คลิกที่นี่เพื่ออ่านเกี่ยวกับเรื่องนี้
original_username

คำตอบ:


114

น่าเศร้าที่คุณไม่สามารถเปิดเผยได้ structตัวแปรร่วมกับ Objective-C ได้ ดูเอกสาร

ณ ตอนนี้ IMHO วิธีที่ดีที่สุดคือสิ่งนี้:

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 }
}

ใน Objective-C คุณสามารถใช้สิ่งเหล่านี้:

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

สามารถเข้าถึง Swift ได้หรือไม่?
khunshan

@khunshan ค่ะ เข้าถึงได้โดยตรงParseClientKeyหรือผ่านชั้นเรียนConstant.clientKey()
Fabian

7
ควรใช้@objc class Constant: NSObject
William Hu

1
วิธีนี้ใช้งานได้ แต่ใน Swift 4 ฉันต้องวางไว้@objcข้างหน้าทุกครั้งclass funcเพื่อให้สามารถเรียกใช้จากรหัส Objective C ได้
ElectroBuddha

2
@ElectroBuddha คุณสามารถทำ@objcMembersในคลาสเพื่อเปิดเผยคลาสทั้งหมดให้กับโค้ด Objective-C
user1898712

19

ทำไมไม่สร้างไฟล์ที่มีทั้ง a structและ an @objc classสิ่งนี้:

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 }
}

สำหรับใช้ในไฟล์ Objective-C ให้เพิ่มสิ่งนี้เมื่อคุณต้องการใช้ค่าคงที่:

#import "ProjectModuleName-Swift.h"

การใช้งานอย่างรวดเร็ว:

self.view.backgroundColor = Constant.kAppGreenColor

การใช้งาน Objective-C:

self.view.backgroundColor = [Constants appGreenColor];

ด้วยวิธีนี้คุณสามารถอัปเดตสีข้อความเริ่มต้น URL บริการเว็บสำหรับทั้งแอปได้ในที่เดียว


1
ไม่ชัดเจนสำหรับฉันในทันทีที่เราสามารถเลื่อนคำตอบของคุณเพื่อค้นหาส่วนวัตถุประสงค์ -c!
Cœur

1

คุณควรกำหนดให้คำสั่ง let เป็นแบบส่วนตัวหากคุณต้องการทำให้ Swift ประเภทอื่น ๆ ในโค้ดของคุณเข้าถึงค่าคงที่เหล่านี้ผ่านทางคลาสเท่านั้น:

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 }
}

ใน Swift คุณสามารถใช้สิ่งเหล่านี้ได้ดังนี้:

UIColor *greenColor = Constant.appGreenColor

บรรทัดต่อไปนี้จะไม่รวบรวมอีกต่อไปเนื่องจากคำสั่ง let เป็นแบบส่วนตัว:

UIColor *greenColor = appGreenColor

1

แม้ว่าสิ่งนี้อาจล่าช้าหรือซ้ำซ้อน แต่ฉันสามารถทำให้มันใช้งานได้กับรหัสต่อไปนี้:

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

เห็นได้ชัดว่าในการใช้รหัส objc c คุณต้องทำ #import "ProjectModuleName-Swift.h"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.