> On Jun 8, 2017, at 11:11 AM, Joel Loeshelle via swift-users 
> <swift-users@swift.org> wrote:
> 
> Hi all,
> 
> Is there any support for having an optional type in an initializer? My use 
> case is I want to have a struct SectionWrapper that includes information 
> about a Collection View Section. So you can pass the CellType, Cell Data 
> Source, and an Optional HeaderType and HeaderDataSource if there is a Section 
> Header. Here's the code. I first have a protocol ViewModelConfigurable that 
> the Cell and Header subclasses conform to:
> 
> protocol ViewModelConfigurable
> {
>     associatedtype ViewModelType
>     
>     func configure(with viewModel : ViewModelType);
> }
> 
> class TestCell : UICollectionViewCell, ViewModelConfigurable
> {
>     typealias ViewModelType = String
>     func configure(with viewModel: String) {
>         //todo
>     }
> }
> 
> class HeaderFooter : UICollectionReusableView, ViewModelConfigurable
> {
>     typealias ViewModelType = String
>     func configure(with viewModel: String) {
>         //todo
>     }
> }
> 
> I then have a SectionWrapper struct where I want to initialize with a 
> concrete UICollectionViewCell type that conforms to ViewModelType and pass 
> the associated dataSource which must be an array of ViewModelType. I also 
> want to have the ability to pass an optional UICollectionReusableView type 
> that conforms to ViewModelType with the associated dataSource. You could then 
> pass nil if this section does not have a Header. See below:
> 
> struct SectionWrapper
> {
>     let cellConfigure: (UICollectionViewCell, Int) -> ()
>     let headerConfigure: ((UICollectionReusableView) -> ())?
>     
>     init<ActualCellType : UICollectionViewCell & ViewModelConfigurable, 
> HeaderType : UICollectionReusableView & ViewModelConfigurable>(cellType : 
> ActualCellType.Type, cellDataSource : [ActualCellType.ViewModelType], 
> headerType : (HeaderType.Type)?, headerDataSource : 
> (HeaderType.ViewModelType)?)
>     {
>         self.cellConfigure = { cell, index in
>             (cell as! ActualCellType).configure(with: cellDataSource[index])
>         }
>         
>         if let headerDataSource = headerDataSource
>         {
>             self.headerConfigure = { header in
>                 (header as! HeaderType).configure(with: headerDataSource);
>             }
>         }
>         else
>         {
>             self.headerConfigure = nil
>         }
>     }
> }
> 
> If I pass nil for headerType and headerDataSource, I get the following error: 
> error: Swift4Test.playground:86:31: error: generic parameter 'ActualCellType' 
> could not be inferred
>  let noHeader = SectionWrapper.init(cellType: TestCell.self, cellDataSource: 
> ["Test"], headerType: nil, headerDataSource: nil) //Gives error
> 
> 
> let header = SectionWrapper.init(cellType: TestCell.self, cellDataSource: 
> ["Test"], headerType: HeaderFooter.self, headerDataSource: "Header") //No 
> error
> 
> let noHeader = SectionWrapper.init(cellType: TestCell.self, cellDataSource: 
> ["Test"], headerType: nil, headerDataSource: nil) //Gives error
> 
> 
> I have also attached the Playground that I'm working through. Please let me 
> know if you have any questions and thanks in advance for your help!

You could overload SectionWrapper.init(), providing two versions: one takes 
non-optional headerType and headerDataSource parameters, and the other does not 
take them at all, and only has a single generic parameter for ActualCellType.

Unfortunately we don’t support explicit specialization on function calls right 
now; if we did, you could write SectionWrapper.init<T, U> to explicitly bind 
the generic arguments.

Slava


> <Swift4Test.playground.zip>_______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to