จะสร้างคลาสที่รวดเร็วสำหรับหมวดหมู่ได้อย่างไร?


84

ฉันต้องการสร้างหมวดหมู่ของคลาส swift ที่มีอยู่ แต่ไม่มีตัวเลือกใน IDE ให้ทำเช่นนั้น

มีความคิดใดบ้างหากมีหมวดหมู่อยู่ในโครงการที่รวดเร็ว หรือจะบรรลุฟังก์ชันที่คล้ายกันในโครงการที่รวดเร็วได้อย่างไร?


2
มันเรียกว่าextension.
holex

คำตอบ:


128

ใน Swift คุณสามารถใช้Extensionsเพื่อเพิ่มฟังก์ชันใหม่ให้กับคลาสโครงสร้างและประเภทการแจงนับที่มีอยู่

พวกเขาแตกต่างจากหมวด Objective-C ในสองสามวิธีหลัก ๆ :

  • ไม่มีชื่อ
  • คุณไม่จำเป็นต้องนำเข้าส่วนขยายอย่างชัดเจน หากคุณกำหนดส่วนขยายเพื่อเพิ่มฟังก์ชันใหม่ให้กับประเภทที่มีอยู่ฟังก์ชันใหม่จะพร้อมใช้งานในอินสแตนซ์ที่มีอยู่ทั้งหมดของประเภทนั้นแม้ว่าจะถูกสร้างขึ้นก่อนที่จะกำหนดส่วนขยายก็ตาม
  • ตามที่ระบุไว้ข้างต้นไม่เพียง แต่ทำงานกับชั้นเรียนเท่านั้น แต่ยังรวมถึงประเภทอื่นด้วย

ดังเช่นปัจจุบันส่วนขยายสามารถ:

  • เพิ่มคุณสมบัติที่คำนวณและคุณสมบัติคงที่ที่คำนวณได้
  • กำหนดวิธีการอินสแตนซ์และวิธีการประเภท
  • จัดเตรียมตัวเริ่มต้นใหม่
  • กำหนดตัวห้อย
  • กำหนดและใช้ประเภทที่ซ้อนกันใหม่
  • สร้างประเภทที่มีอยู่ให้สอดคล้องกับโปรโตคอล

ไวยากรณ์พื้นฐานในการประกาศส่วนขยายมีดังนี้:

extension SomeType {
    // new functionality to add to SomeType goes here
}

ตรวจสอบเอกสารของ Appleสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ส่วนขยายใน Swift


99

ใน Objective C เรียกว่าหมวดหมู่แต่ใน Swift เรียกว่าส่วนขยายส่วนขยายจุดประสงค์ของทั้งคู่คือเพื่อเพิ่มฟังก์ชันการทำงานเพิ่มเติมให้กับคลาสที่มีอยู่โดยไม่ต้องสร้างคลาสย่อย

ฉันได้อ่านเกี่ยวกับส่วนขยายในเอกสารประกอบ แต่ฉันไม่เข้าใจวิธีใช้ส่วนขยายในโครงการของฉันจนกว่าฉันจะดูวิดีโอแนะนำนี้ ( เวอร์ชัน YouTube , แหล่ง github )

นี่คือบทสรุปที่นำมาจากวิดีโอวิธีการทำ

เพิ่มไฟล์ Swift ในโปรเจ็กต์ของคุณ

  • คลิกขวาใน Project Navigator แล้วเลือก "New File ... "

  • เลือก "ไฟล์ Swift"

  • หลักการคือการบันทึกชื่อไฟล์เป็นชื่อคลาสที่คุณกำลังขยายบวก (ด้วยเครื่องหมาย "+") สิ่งที่คุณกำลังทำ ตัวอย่างเช่น "UIImage + Cropping"

เขียนโค้ดสำหรับส่วนขยาย

เปิดไฟล์ Swift ใหม่ที่คุณเพิ่งสร้างขึ้น

คุณควรนำเข้าUIKit(แทนFoundation) หากคุณกำลังขยายไฟล์UIView. จากนั้นใช้ไฟล์extensionคีย์เวิร์ดหน้าชื่อคลาสที่คุณต้องการขยาย จากนั้นคุณสามารถเพิ่มวิธีการใหม่ของคุณเองในชั้นเรียนได้ (หมายเหตุส่วนขยายมีไว้สำหรับการเพิ่มวิธีการใหม่ไม่ได้แทนที่วิธีการที่มีอยู่ดังนั้นชื่อนี้)

ในวิดีโอตัวอย่างคือการเพิ่มวิธีการครอบตัดวงกลมจากรูปภาพและกำหนดเส้นขอบ

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

ดูที่นี่สำหรับตัวอย่างเต็มรูปแบบ

ใช้ส่วนขยายของคุณได้ทุกที่ในโครงการของคุณ

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

นี่คือตัวอย่างของวิดีโอ ( บน github ):

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

วิธีcropToCircleWithBorderColorนี้ไม่ได้เป็นส่วนมาตรฐานUIImageแต่อย่างที่คุณเห็นมันถูกใช้เหมือนเดิม

ศึกษาเพิ่มเติม:


8

ใน Swift เรียกว่าExtensions ! ลองดูสิ


แต่extensionไม่สามารถรวมตัวแปรได้ซึ่งทำให้สิ่งต่างๆแตกต่างกันโดยสิ้นเชิง
RnMss

แม้แต่ในหมวด Objective-C ก็ไม่สามารถมีตัวแปรได้ (หากไม่มีแฮ็ก)
Valentin Shergin

วัตถุที่เกี่ยวข้องกับ ObjC ไม่ใช่แฮ็ก
malhal

0

คุณสามารถใช้รหัสต่อไปนี้ในชั้นเรียนที่คุณมีอยู่

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