ฉันได้พยายามแก้ไขปัญหานี้ให้เป็นรูปแบบที่ง่ายที่สุดดังต่อไปนี้
ติดตั้ง
Xcode เวอร์ชัน 6.1.1 (6A2008a)
enum ที่กำหนดไว้ในMyEnum.swift
:
internal enum MyEnum: Int {
case Zero = 0, One, Two
}
extension MyEnum {
init?(string: String) {
switch string.lowercaseString {
case "zero": self = .Zero
case "one": self = .One
case "two": self = .Two
default: return nil
}
}
}
และรหัสที่เริ่มต้น enum ในไฟล์อื่นMyClass.swift
:
internal class MyClass {
let foo = MyEnum(rawValue: 0) // Error
let fooStr = MyEnum(string: "zero")
func testFunc() {
let bar = MyEnum(rawValue: 1) // Error
let barStr = MyEnum(string: "one")
}
}
ข้อผิดพลาด
Xcode ทำให้ฉันมีข้อผิดพลาดต่อไปนี้เมื่อพยายามเริ่มต้นMyEnum
ด้วยตัวเริ่มต้นค่าดิบ:
Cannot convert the expression's type '(rawValue: IntegerLiteralConvertible)' to type 'MyEnum?'
หมายเหตุ
ตามคู่มือภาษา Swift :
หากคุณกำหนดนับมีประเภทดิบมูลค่านับได้รับการเริ่มต้นที่จะนำค่าของชนิดมูลค่าดิบ (เป็นพารามิเตอร์ที่เรียกว่าโดยอัตโนมัติ
rawValue
)nil
และผลตอบแทนทั้งที่เป็นสมาชิกหรือการแจงนับกำหนดเองสำหรับการเริ่มต้น
MyEnum
ถูกกำหนดไว้ในส่วนขยายเพื่อทดสอบว่า enum ของ initializer ดิบมูลค่าถูกลบออกเพราะกรณีต่อไปนี้จากคู่มือภาษา อย่างไรก็ตามมันได้ผลลัพธ์ข้อผิดพลาดเดียวกันโปรดทราบว่าหากคุณกำหนดตัวเริ่มต้นแบบกำหนดเองสำหรับประเภทค่าคุณจะไม่สามารถเข้าถึงตัวเริ่มต้นเริ่มต้นได้อีกต่อไป (หรือตัวเริ่มต้นแบบสมาชิกถ้าเป็นโครงสร้าง) สำหรับประเภทนั้น [... ]
หากคุณต้องการให้ประเภทค่าที่กำหนดเองของคุณสามารถเริ่มต้นได้ด้วยตัวเริ่มต้นเริ่มต้นและตัวเริ่มต้นแบบสมาชิกและด้วยตัวเริ่มต้นที่คุณกำหนดเองให้เขียนตัวเริ่มต้นที่กำหนดเองในส่วนขยายแทนที่จะเป็นส่วนหนึ่งของการใช้งานดั้งเดิมของประเภทค่าย้ายนิยาม enum เพื่อ
MyClass.swift
แก้ไขข้อผิดพลาดสำหรับแต่ไม่ได้สำหรับbar
foo
การลบตัวเริ่มต้นที่กำหนดเองจะช่วยแก้ข้อผิดพลาดทั้งสองอย่าง
วิธีแก้ปัญหาอย่างหนึ่งคือการรวมฟังก์ชันต่อไปนี้ในนิยาม enum และใช้แทนค่าเริ่มต้นค่าดิบที่ระบุ ดังนั้นจึงดูเหมือนว่าการเพิ่มที่กำหนดเองการเริ่มต้นมีผลคล้ายกับเครื่องหมาย
private
initializerinit?(raw: Int) { self.init(rawValue: raw) }
ประกาศอย่างชัดเจนว่าโปรโตคอลสอดคล้องกับ
RawRepresentable
ในMyClass.swift
แก้ไขข้อผิดพลาดแบบอินไลน์สำหรับbar
แต่ผลในข้อผิดพลาดเกี่ยวกับลิงเกอร์สัญลักษณ์ที่ซ้ำกัน (เพราะดิบมูลค่า enums ประเภทโดยปริยายไปตามRawRepresentable
)extension MyEnum: RawRepresentable {}
ใครช่วยให้ข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่ได้ไหม เหตุใดเครื่องมือเริ่มต้นค่าดิบจึงไม่สามารถเข้าถึงได้
internal
ขอบเขต (หรืออย่างน้อยตรงกับประเภท)private
ไม่ได้