2014-06-05 12 views
18

Làm cách nào để tạo một hàm riêng tư trong Swift?Làm cách nào để tạo một chức năng riêng tư trong Swift?

Dưới đây là một ví dụ:

import UIKit 

class AnotherClass { 

    var someVar = 1 
    let someConst = 2 

    func somePrivateFunc() -> Bool { 
     return true 
    } 

    func someFunc() -> (Int -> Bool) { 
     var someInnerFuncVar = { (num: Int)->Bool in 
      return true 
     } 

     return someInnerFuncVar 
    } 

    init() { 
     var vc = ViewController() 
    } 

} 

Nhưng nếu điều này là cách duy nhất để làm điều đó ....

Trả lời

16

Tại thời điểm này không có từ bổ nghĩa tầm nhìn trong nhanh chóng.

Trên diễn đàn dành cho nhà phát triển, các tác giả ngôn ngữ cho biết nó nằm ở đầu danh sách ưu tiên của họ.

Trích dẫn greg parker từ here:

Chúng tôi thường không hứa hẹn bất cứ điều gì cho tương lai, nhưng trong trường hợp này, chúng tôi đang làm cho một ngoại lệ. Swift sẽ có cơ chế kiểm soát truy cập.

Trong cùng một diễn đàn, chúng đề xuất bạn có thể sử dụng các lớp lồng nhau, theo cách này, nhưng điều này thực sự chỉ ngăn chặn hoàn thành mã để nắm bắt các phương thức bên trong. Chúng không thực sự riêng tư theo nghĩa là bất kỳ ai cũng có thể khởi tạo lớp lồng nhau và truy cập các phương thức đó.

import Foundation 

class KSPoint { 

    class _KSPointInner { 
     class func distance(point p1 : KSPoint, toPoint p2 : KSPoint) -> Double { 
      return sqrt(pow(Double(p2.x - p1.x), 2) + pow(Double(p2.y - p1.y), 2)) 
     } 
    } 

    var x : Int 

    func distance(point : KSPoint, toPoint : KSPoint) -> Double { 
     return _KSPointInner.distance(point: point, toPoint: toPoint) 
    } 
} 
4

Ngoài ra, bạn có thể sử dụng Nested Classes như vậy:

// Public interface 
class Bakery 
{ 
    // Private implementation 
    class Baker 
    { 
     func prepareToMakeBread(numberOfLoafs:Int) 
     { 
      println("Preparing to make \(numberOfLoafs) loafs of bread...") 
     } 

     func bakeBread() 
     { 
      println("Baking the bread...") 
     } 

     func packageBread() 
     { 
      println("Packaging the freshly baked bread...") 
     } 
    } 

    // Public method 
    func buyBread(numberOfLoafs:Int) 
    { 
     println("Customer requests \(numberOfLoafs) loafs of bread!") 

     let baker = Bakery.Baker() 

     baker.prepareToMakeBread(numberOfLoafs) 
     baker.bakeBread() 
     baker.packageBread() 
    } 
} 

let bakery = Bakery()  
bakery.buyBread(4) 

Output:

Customer requests 4 loafs of bread! 
Preparing to make 4 loafs of bread... 
Baking the bread... 
Packaging the freshly baked bread... 

Tuy nhiên, về mặt kỹ thuật họ không tin là ai đó có thể nhanh chóng một Bakery.Baker và gọi các phương pháp. Chức năng bên trong các chức năng hoạt động nhưng rất xấu xí ...

+0

Làm cách nào tôi có thể sử dụng một số đối tượng 'Bakery' trong' Baker' ?? –

+0

OK, [ở đây] (http://stackoverflow.com/a/27139165/3110026) –

4

Xem câu trả lời của tôi over here.

Tóm lại, khi bạn nói về cách tạo "phương thức riêng" hoặc "hàm riêng" trong Swift hoặc ObjC (hoặc ruby ​​hoặc java hoặc ...), các phương pháp đó không thực sự "riêng tư". Không có kiểm soát truy cập thực tế xung quanh họ. Bất kỳ ngôn ngữ nào cung cấp thậm chí một chút nội tâm cho phép các nhà phát triển có được những giá trị đó từ bên ngoài lớp nếu họ thực sự muốn. Vì vậy, những gì chúng ta đang nói đến là một cách để xác định một giao diện công khai chỉ hiển thị chức năng chúng ta muốn, và "ẩn" phần còn lại mà chúng ta xem là "riêng tư".

Cơ chế nhanh chóng để khai báo giao diện là và có thể được sử dụng cho mục đích này.

Các vấn đề liên quan