2016-06-29 3 views
1

Обычно я создаю экземпляр класса за так:Как создать экземпляр типа object-c?

Класс Родитель:

@interface baseClass 
+ (instancetype)task; 
@end 
@implement baseClass 
+ (instancetype)task { 
    return [[[self class] alloc] init]; 
} 
@end 

, а затем в детском классе:

@interface childClass : baseClass 
@end 
@implement childClass 
@end 

Наконец, я могу создать экземпляр с помощью:

childClass *pChild = [childClass task]; 

Как я могу реализовать эту функцию используя язык программирования Swift?

В другом слове, как я мог реализовать [[[self class] alloc] init] быстрым способом?

ответ

0

Я чувствую себя немного небезопасной о вас помечено ваш вопрос как одноточечного, но в основном код, который вы представили, не имеет ничего общего с синглтонов, поэтому я попытался подражать вашим оригинальным классам и показать здесь несколько вариантов.

они написаны на Swift 2.2.


дело № 1

, который работает безотказно первоначально:

class BaseClass { 

    class func task() -> BaseClass { 
     return BaseClass() 
    } 

    // ... 

} 

class ChildClass : BaseClass { 

    override class func task() -> ChildClass { 
     return ChildClass() 
    } 

    // ... 

} 

, то вы могли бы получить экземпляры, как это:

let bTask: BaseClass = BaseClass.task() 
let cTask: ChildClass = ChildClass.task() 

делу № 2

вы также можете сделать что-то подобное, если такая вещь выглядит более разумным для вас:

class BaseClass { 

    class var task: AnyObject { 
     get { 
      return self.init() 
     } 
    } 

    required init() { 

    } 

    // ... 

} 

class ChildClass : BaseClass { 

    // ... 

} 

, то вы можете создать экземпляр классы как:

let bTask: BaseClass = BaseClass.task as! BaseClass 
let cTask: ChildClass = ChildClass.task as! ChildClass 

дела № 3

вот еще один вариант для вас, если вас не устраивает какая-либо из идей выше:

class BaseClass { 

    class func task() -> Self { 
     return self.init() 
    } 

    required init() { 

    } 

    // ... 

} 

class ChildClass : BaseClass { 

    // ... 

} 

инстанцирование аналогично первый случай:

let bTask: BaseClass = BaseClass.task() 
let cTask: ChildClass = ChildClass.task() 

ПРИМЕЧАНИЕ: Вам может понадобиться для уточнения выбранной концепции для окончательного кода, если вы хотите иметь дело с реальными одиночками, эти примерами не были полностью разработаны, как я упоминал в начале, но они показывают вам несколько вариантов, которые вы можете использовать, и можете использовать их в качестве шаблона.

+0

Спасибо большое! ** Случай №3 ** работает для меня. Еще раз спасибо! Я думаю о том, что у Swift много непонятного синтаксиса. Поэтому я много раз вводил в заблуждение. – imeteora

+0

@imeteora, не проблема, я оставлю здесь и другие два варианта; кто знает, может быть, кто-то сможет их использовать в будущем. – holex

-1

В Swift (добавить класс перед каждым FUNC):

class baseClass: NSObject { 
    class func task() { 

    } 
} 

class childClass: baseClass { 

} 

let test = childClass.task() 
+0

@imeteora: мой ответ был обновлен. –

-1
class var sharedInstance :CommonUtil { 
    struct Singleton { 
     static let instance = CommonUtil() 
    } 

    return Singleton.instance 
} 
+0

ОП не имеет отношения к синглонам здесь. – holex

0

Если AClass не подкласс NSObject

class AClass { 
    required init() { 

    } 
    class func task() -> Self { 
     return self.init() 
    } 
} 

class BClass : AClass { 

} 

let x = BClass.task() 

Вам необходимо осуществить init() и добавить required ключевое слово, потому что, если хотите подкласс BClass или другой класс, унаследованный от AClass можно использовать task, вы должны убедиться, подкласс может использовать init();

В противном случае вам нужно добавить final ключевое слово:

final class AClass { 
    init() { 

    } 
    class func task() -> Self { 
     return self.init() 
    } 
} 

, но я думаю, что вам это не нужно.

И если AClass наследуется от NSObject, вам нужно переопределить init() и добавить required тоже:

class AClass : NSObject { 
    required override init() { 

    } 
    class func task() -> Self { 
     return self.init() 
    } 
} 

class BClass : AClass { 

} 
Смежные вопросы