คำถามติดแท็ก swift-protocols

6
ฉันจะทำให้การอ้างอิงโปรโตคอลที่อ่อนแอใน 'บริสุทธิ์' Swift (ไม่มี @objc) ได้อย่างไร
weakดูเหมือนว่าการอ้างอิงจะไม่ทำงานใน Swift ยกเว้นว่ามีการprotocolประกาศเป็น@objcซึ่งฉันไม่ต้องการในแอพ Swift ที่บริสุทธิ์ รหัสนี้ให้ข้อผิดพลาดในการคอมไพล์ ( weakไม่สามารถใช้กับประเภทที่ไม่ใช่คลาสMyClassDelegate): class MyClass { weak var delegate: MyClassDelegate? } protocol MyClassDelegate { } ฉันต้องนำหน้าโปรโตคอลด้วย@objcแล้วก็ใช้งานได้ คำถาม: อะไรคือวิธีที่รวดเร็ว 'บริสุทธิ์' ในการบรรลุเป้าหมายweak delegate?


7
การใช้โปรโตคอลเป็นประเภทอาร์เรย์และพารามิเตอร์ฟังก์ชันอย่างรวดเร็ว
ฉันต้องการสร้างคลาสที่สามารถจัดเก็บอ็อบเจ็กต์ที่สอดคล้องกับโปรโตคอลบางอย่าง วัตถุควรถูกเก็บไว้ในอาร์เรย์ที่พิมพ์ ตามโปรโตคอลเอกสาร Swift สามารถใช้เป็นประเภท: เนื่องจากเป็นประเภทคุณจึงสามารถใช้โปรโตคอลได้ในหลายที่ที่อนุญาตประเภทอื่น ๆ ได้แก่ : เป็นประเภทพารามิเตอร์หรือประเภทการส่งคืนในฟังก์ชันวิธีการหรือตัวเริ่มต้น เป็นชนิดของค่าคงที่ตัวแปรหรือคุณสมบัติ เป็นประเภทของรายการในอาร์เรย์พจนานุกรมหรือคอนเทนเนอร์อื่น ๆ อย่างไรก็ตามสิ่งต่อไปนี้สร้างข้อผิดพลาดของคอมไพเลอร์: โปรโตคอล 'SomeProtocol' สามารถใช้เป็นข้อ จำกัด ทั่วไปเท่านั้นเนื่องจากมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง คุณควรแก้ปัญหานี้อย่างไร: protocol SomeProtocol: Equatable { func bla() } class SomeClass { var protocols = [SomeProtocol]() func addElement(element: SomeProtocol) { self.protocols.append(element) } func removeElement(element: SomeProtocol) { if let index = find(self.protocols, element) …

3
โปรโตคอลไม่สอดคล้องกับตัวเอง?
เหตุใดจึงไม่รวบรวมรหัส Swift นี้ protocol P { } struct S: P { } let arr:[P] = [ S() ] extension Array where Element : P { func test<T>() -> [T] { return [] } } let result : [S] = arr.test() คอมไพเลอร์ระบุว่า: "Type Pไม่เป็นไปตามโปรโตคอลP" (หรือใน Swift เวอร์ชันที่ใหม่กว่า "ไม่รองรับ" การใช้ "P" เป็นคอนกรีตที่สอดคล้องกับโปรโตคอล …

2
อะไรคือ“ โปรโตคอล…สามารถใช้เป็นข้อ จำกัด ทั่วไปได้เพราะมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง” หมายความว่าอย่างไร
ฉันกำลังพยายามสร้างพจนานุกรม (จริงๆแล้วเป็นHashSet ) ที่คีย์บนโปรโตคอลที่กำหนดเองใน Swift แต่มันทำให้ฉันมีข้อผิดพลาดในชื่อ: โปรโตคอล 'myProtocol' สามารถใช้เป็นข้อ จำกัด ทั่วไปเท่านั้นเนื่องจากมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง และฉันไม่สามารถสร้างหัวหรือหางของมันได้ protocol Observing: Hashable { } var observers = HashSet<Observing>()

3
วิธีการที่ไม่ใช่ '@ objc' ไม่เป็นไปตามข้อกำหนดทางเลือกของโปรโตคอล '@objc'
ภาพรวม: ฉันมีโปรโตคอล P1 ซึ่งจัดเตรียมการใช้งานตามค่าเริ่มต้นของฟังก์ชันเสริม Objective-C อย่างใดอย่างหนึ่ง เมื่อฉันจัดเตรียมการใช้งานฟังก์ชันเสริมเริ่มต้นจะมีคำเตือน คำเตือนของคอมไพเลอร์: Non-'@objc' method 'presentationController(_:viewControllerForAdaptivePresentationStyle:)' does not satisfy optional requirement of '@objc' protocol 'UIAdaptivePresentationControllerDelegate' เวอร์ชัน: สวิฟต์: 3 Xcode: 8 (เผยแพร่สู่สาธารณะ) ความพยายามที่ทำ: พยายามเพิ่ม@objcแต่ไม่ช่วย คำถาม: ฉันจะแก้ไขปัญหานี้ได้อย่างไร มีงานทำไหม? รหัส: @objc protocol P1 : UIAdaptivePresentationControllerDelegate { } extension P1 where Self : UIViewController { func presentationController(_ controller: UIPresentationController, …

5
โปรโตคอลสามารถใช้เป็นข้อ จำกัด ทั่วไปเท่านั้นเนื่องจากมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง
ฉันมีโปรโตคอล RequestType และมี AssociatedType Model ดังต่อไปนี้ public protocol RequestType: class { associatedtype Model var path: String { get set } } public extension RequestType { public func executeRequest(completionHandler: Result<Model, NSError> -> Void) { request.response(rootKeyPath: rootKeyPath) { [weak self] (response: Response<Model, NSError>) -> Void in completionHandler(response.result) guard let weakSelf = self …

5
ใน Swift ฉันจะประกาศตัวแปรประเภทเฉพาะที่สอดคล้องกับโปรโตคอลอย่างน้อยหนึ่งรายการได้อย่างไร
ใน Swift ฉันสามารถตั้งค่าประเภทของตัวแปรอย่างชัดเจนโดยการประกาศดังต่อไปนี้: var object: TYPE_NAME หากเราต้องการก้าวไปอีกขั้นและประกาศตัวแปรที่สอดคล้องกับโปรโตคอลหลายตัวเราสามารถใช้การprotocolประกาศ: var object: protocol<ProtocolOne,ProtocolTwo>//etc จะเป็นอย่างไรหากฉันต้องการประกาศอ็อบเจ็กต์ที่เป็นไปตามโปรโตคอลตั้งแต่หนึ่งโปรโตคอลขึ้นไปและเป็นประเภทคลาสพื้นฐานที่เฉพาะเจาะจง Objective-C ที่เทียบเท่าจะมีลักษณะดังนี้: NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...; ใน Swift ฉันคาดหวังว่ามันจะมีลักษณะเช่นนี้: var object: TYPE_NAME,ProtocolOne//etc สิ่งนี้ทำให้เรามีความยืดหยุ่นในการจัดการกับการใช้งานประเภทพื้นฐานตลอดจนอินเทอร์เฟซเพิ่มเติมที่กำหนดไว้ในโปรโตคอล มีวิธีอื่นที่ชัดเจนกว่าที่ฉันอาจพลาดไปหรือไม่? ตัวอย่าง ตัวอย่างเช่นสมมติว่าฉันมีUITableViewCellโรงงานที่รับผิดชอบในการส่งคืนเซลล์ที่เป็นไปตามโปรโตคอล เราสามารถตั้งค่าฟังก์ชันทั่วไปที่ส่งคืนเซลล์ที่เป็นไปตามโปรโตคอลได้อย่างง่ายดาย: class CellFactory { class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T { //etc } } ในภายหลังฉันต้องการยกเลิกการจัดคิวเซลล์เหล่านี้ในขณะที่ใช้ประโยชน์จากทั้งชนิดและโปรโตคอล var cell: …

15
จะทำให้ enum สอดคล้องกับโปรโตคอลใน Swift ได้อย่างไร
เอกสารสวิฟท์กล่าวว่าการเรียน , structsและenumsทุกคนสามารถเป็นไปตามโปรโตคอลและฉันจะได้รับไปยังจุดที่พวกเขาทั้งหมดสอดคล้อง แต่ฉันไม่สามารถได้รับenumจะประพฤติค่อนข้างชอบชั้นและstructตัวอย่าง: protocol ExampleProtocol { var simpleDescription: String { get set } mutating func adjust() } class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." } } var a = SimpleClass() …

4
“ ข้อผิดพลาดร้ายแรง: อาร์เรย์ไม่สามารถเชื่อมโยงกับ Objective-C ได้” - ทำไมคุณถึงลองใช้ Swift?
ฉันได้ประกาศโปรโตคอล Swift: protocol Option { var name: String { get } } ฉันประกาศการใช้โปรโตคอลนี้หลายครั้ง - บางคลาสบางอัน ฉันมีตัวควบคุมมุมมองพร้อมคุณสมบัติที่ประกาศดังนี้: var options: [Option] = [] เมื่อฉันพยายามตั้งค่าคุณสมบัตินี้เป็นอาร์เรย์ของวัตถุที่ใช้Optionโปรโตคอลใน VC อื่นprepareForSegueฉันได้รับข้อผิดพลาดรันไทม์: fatal error: array cannot be bridged from Objective-C ทำไมถึงไม่ทำงาน คอมไพเลอร์มีข้อมูลทั้งหมดที่ต้องการและฉันไม่เข้าใจว่า Objective-C เกี่ยวข้องกับอะไรเลย - โปรเจ็กต์ของฉันมีเฉพาะไฟล์ Swift เท่านั้นและอาร์เรย์เหล่านี้ไม่ได้เข้ามาหรือออกจากเมธอดกรอบใด ๆ ที่จะ NSArrayเลี่ยงพวกเขาจะถูกเชื่อมไป

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