属性包装器:“无法在属性初始化程序中使用实例成员;属性初始化程序在'self'可用之前运行”

时间:2020-03-06 07:56:03

标签: ios swift property-wrapper

我正在尝试创建波纹管属性包装器

@propertyWrapper
public struct ConstraintValue {

    private let view:UIView
    private let contraint:NSLayoutConstraint

    public init(contraint:NSLayoutConstraint,view:UIView) {
        self.contraint = contraint
        self.view = view
    }

    public var wrappedValue: CGFloat {
        set {
            contraint.constant = newValue
            view.layoutIfNeeded()

        }

        get {
            return contraint.constant
        }

    }
}

但是当我尝试使用它时,我得到“无法在属性初始化程序中使用实例成员;属性初始化程序在'self'可用之前运行”

@IBOutlet weak private var imageViewHeightConstraint: NSLayoutConstraint!
 @ConstraintValue(contraint: imageViewHeightConstraint, view: self)
 public var imageHeight:CGFloat

有没有办法解决此错误?

1 个答案:

答案 0 :(得分:0)

您不能使用<?php namespace App\Http\Controllers\Havence; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Mail; use Session; use App\Mail\Automail; use App\auto_mail_condition; use App\modulename; use App\AutoEmailTemplate; use App\EmailSave; use App\AppModule; use app\resources\views\emails\Automailsend; class AutoMailController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $mailTemplates =AutoEmailTemplate::all(); return view('havence.marketing.index',compact('mailTemplates')); } public function create(Request $request) { $request->validate([ 'subject' => 'required', 'message' => 'required', //'select'=>'required', 'days'=>'required' ]); $data = [ 'subject' => $this->replaceVariables($request->subject), 'message' => $this->replaceVariables($request->message), //'select' => $this->replaceVariables($request->select), 'days' => $this->replaceVariables($request->days) ]; } protected function getReplaceable() { return [ '{customer_name}' => Auth::user()->name , ]; } protected function replaceVariables($message) { $items = $this->getReplaceable(); foreach($items as $key => $value) { $message = str_replace($key, $value, $message); } return $message; } public function store(Request $request) { // Store the data into the db $data = $request->all(); $data['created_by'] = Auth::id(); return AutoEmailTemplate::create($data); } public function show($id) { // } public function edit(AutoEmailTemplate $mailTemplates , $id) { $mailTemplates=AutoEmailTemplate::find($id); $conditions= auto_mail_condition::all(); $modules=AppModule::all(); return view('havence.marketing.edit', compact('mailTemplates','conditions','modules')); } public function update(Request $request, $id) { // $mailTemplates=AutoEmailTemplate::find($id); // $input = $request->all(); // $mailTemplates->fill($input)->save(); // Session::flash('flash_message', 'Task successfully added!'); // return redirect()->back(); } public function destroy($id) { $mailTemplates =AutoEmailTemplate::findOrFail($id); $mailTemplates->delete(); return redirect('automail/index')->with(['message'=> 'Successfully deleted!!']); } public function mail() { $conditions= auto_mail_condition::all(); $modules=AppModule::all(); //$mailTemplates=AutoEmailTemplate::all(); return view(('havence.marketing.create'),compact('conditions','modules')); } } self初始化此属性,因为此属性目前不存在。

最简单的解决方案是在视图的imageViewHeightConstraint方法中将约束和视图传递给包装器,如下所示:

init()

或者,您可以将KeyPath用于@propertyWrapper public struct ConstraintValue { var view: UIView! var constraint: NSLayoutConstraint! public var wrappedValue: CGFloat { set { constraint.constant = newValue view.layoutIfNeeded() } get { return constraint.constant } } } class OurView: UIView { var imageViewHeightConstraint: NSLayoutConstraint! @ConstraintValue public var imageHeight:CGFloat init() { super.init(size: .zero) _imageHeight.view = self _imageHeight.constraint = imageViewHeightConstraint } } ,并将imageViewHeightConstraint传递给视图的self中的属性包装器。像这样:

init()