2015-06-15 16 views
5

Đó là sự hiểu biết của tôi rằng về Xcode 6.3/Swift 1.2, tôi có thể sử dụng các biến tĩnh và các phương thức bên trong một lớp. Tuy nhiên, trình biên dịch không thích nó khi tôi cố gắng khởi tạo một biến tĩnh bằng cách gọi một hàm tĩnh (tôi nhận được lỗi 'Sử dụng định danh chưa được giải quyết getDefaultString' trong ví dụ bên dưới). Dưới đây là một đoạn trích minh họa sự cố của tôi:Tại sao tôi không thể khởi tạo biến tĩnh bằng cách gọi một hàm tĩnh trong Swift?

import Foundation 

public class Settings { 
    private static var _bundle = NSBundle.mainBundle() 
    static func getDefaultString(key: String) -> String { 
     return _bundle.objectForInfoDictionaryKey(key) as! String 
    } 

    private static var _server = getDefaultString("DefaultServer") 
    public class var server: String { 
     get { return _server } 
     set { _server = newValue } 
    } 
} 

Ai đó có thể giúp tôi hiểu tại sao tôi không thể làm điều này?

+0

Tính năng này có hoạt động nếu bạn sử dụng 'private static var _server = Settings.getDefaultString (" DefaultServer ")'? – NobodyNada

+1

Như một vấn đề của thực tế, nó có. Nhưng tôi không hiểu tại sao? – markdb314

Trả lời

11

này nên làm việc:

private static var _server = Settings.getDefaultString("DefaultServer") 

Tôi không biết chính xác lý do tại sao, có vẻ như rằng có một số loại một giả định trong vở kịch mà một phương pháp không có loại trình độ trước mặt nó là một phương pháp dụ. Nhưng điều đó không hoàn toàn hoạt động. Ví dụ. điều này tạo ra kết quả thú vị trong sân chơi:

class Foo { 

     static func initFoo() -> String { 
      return "static" 
     } 

     func initFoo() -> String { 
      return "instance" 
     } 

     static var foo: String = initFoo() 

    } 

    Foo.foo 

... không cần phải đủ điều kiện nhập trước initFoo(), nhưng vẫn cần chọn loại tĩnh trước. Một lỗi nhỏ có thể.

0

Bạn đang buộc phải tháo rời một đối tượng có thể (và thực tế) nil.

return _bundle.objectForInfoDictionaryKey(key) as! String 

NSBundle 's objectForInfoDictionaryKey có thể trở lại con số không - khai của nó:

func objectForInfoDictionaryKey(key: String) -> AnyObject? 

chỉnh sửa của tôi, như một sân chơi:

import Foundation 

class Settings { 
    private static var _bundle = NSBundle.mainBundle() 
    static func getDefaultString(key: String) -> String? { 
     return _bundle.objectForInfoDictionaryKey(key) as? String 
    } 

    private static var _server = Settings.getDefaultString("DefaultServer") 

    class var server: String? { 
     get { return _server } 
     set { _server = newValue } 
    } 
} 

Settings.server 

Bạn có thể, tất nhiên, dự phòng từ một nil trong một số thời trang khác nếu bạn thích.

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